码迷,mamicode.com
首页 > 其他好文 > 详细

R 540

时间:2019-02-20 10:01:37      阅读:104      评论:0      收藏:0      [点我收藏+]

标签:pre   clu   main   vector   c++   mes   一个   view   ext   

好久没写题解了嘻嘻嘻,昨天补edu自闭了一天还没补完fg这div3令人愉悦。

F2不会。   待补,感觉不太好写,打算看一下别人代码。

队友说是 缩点+dp

卡D卡了有点久。快一个半小时才7题。。。

A:

技术图片
 1 #include <bits/stdc++.h>
 2 #define mk(a,b) make_pair(a,b)
 3 #define pii pair<int,int>
 4 using namespace std;
 5 typedef long long ll;
 6 const ll mod = 1e9+7;
 7 inline int read() {
 8     int X=0,w=1; char c=getchar();
 9     while (c<0||c>9) { if (c==-) w=-1; c=getchar(); }
10     while (c>=0&&c<=9) X=(X<<3)+(X<<1)+c-0,c=getchar();
11     return X*w;
12 }
13 const int N = 1e5+5;
14 int q;ll n,a,b;
15 int main(){
16     ios::sync_with_stdio(false);
17     cin>>q;
18     while (q--){
19         cin>>n>>a>>b;
20         if(2*a<=b){
21             cout<<n*a<<endl;
22         } else{
23             if(n%2==0){
24                 cout<<n/2*b<<endl;
25             } else{
26                 cout<<n/2*b+a<<endl;
27             }
28         }
29     }
30 }
View Code

B:枚举每个删掉的,维护奇偶数前缀和。

技术图片
 1 #include <bits/stdc++.h>
 2 #define mk(a,b) make_pair(a,b)
 3 #define pii pair<int,int>
 4 using namespace std;
 5 typedef long long ll;
 6 const ll mod = 1e9+7;
 7 inline int read() {
 8     int X=0,w=1; char c=getchar();
 9     while (c<0||c>9) { if (c==-) w=-1; c=getchar(); }
10     while (c>=0&&c<=9) X=(X<<3)+(X<<1)+c-0,c=getchar();
11     return X*w;
12 }
13 const int N = 2e5+5;
14 int n,a[N],odd[N],even[N];
15 int main(){
16     n=read();
17     for(int i=1;i<=n;i++){
18         a[i]=read();
19         odd[i]=odd[i-1];
20         even[i]=even[i-1];
21         if(i&1){
22             odd[i]+=a[i];
23         } else{
24             even[i]+=a[i];
25         }
26     }
27     int ans=0;
28     for(int i=1;i<=n;i++){
29         ll s1=odd[i-1]+even[n]-even[i];
30         ll s2=even[i-1]+odd[n]-odd[i];
31         if(s1==s2){
32             ans++;
33         }
34     }
35     cout<<ans<<endl;
36 }
View Code

C:模拟,没啥好说的。注意偶数必须全是4的倍数,奇数的情况 只能有一个奇数,4的倍数大于(n/2)*(n/2)。

然后填就行了。

技术图片
  1 #include <bits/stdc++.h>
  2 #define mk(a,b) make_pair(a,b)
  3 #define pii pair<int,int>
  4 using namespace std;
  5 typedef long long ll;
  6 const ll mod = 1e9+7;
  7 inline int read() {
  8     int X=0,w=1; char c=getchar();
  9     while (c<0||c>9) { if (c==-) w=-1; c=getchar(); }
 10     while (c>=0&&c<=9) X=(X<<3)+(X<<1)+c-0,c=getchar();
 11     return X*w;
 12 }
 13 const int N = 1e5+5;
 14 int n,a[22][22],c[555],num[1005];
 15 int main(){
 16     n=read();
 17     for(int i=1;i<=n*n;i++){
 18         c[i]=read();
 19         num[c[i]]++;
 20     }
 21     if(n%2==0){
 22         for(int i=1;i<=1000;i++){
 23             if(num[i]%4){
 24                 cout<<"NO";
 25                 exit(0);
 26             }
 27         }
 28         cout<<"YES"<<endl;
 29         int k=1;
 30         for(int i=0;i<n/2;i++){
 31             for(int j=0;j<n/2;j++){
 32                 for(;k<=1000;){
 33                     if(num[k]>=4){
 34                         a[i][j]=a[n-i-1][j]=a[i][n-j-1]=a[n-i-1][n-j-1]=k;
 35                         num[k]-=4;
 36                         break;
 37                     } else{
 38                         k++;
 39                     }
 40                 }
 41             }
 42         }
 43         for(int i=0;i<n;i++){
 44             for(int j=0;j<n;j++){
 45                 cout<<a[i][j]<< ;
 46             }
 47             cout<<endl;
 48         }
 49     } else{
 50         int f=0;
 51         int cnt=0;
 52         for(int i=1;i<=1000;i++){
 53             if(num[i]&1){
 54                 if(f){
 55                     cout<<"NO"<<endl;
 56                     exit(0);
 57                 } else{
 58                     f=i;
 59                     num[i]--;
 60                 }
 61             }
 62             if(num[i]>=4){
 63                 cnt+=num[i]/4;
 64             }
 65         }
 66         if(cnt<(n/2)*(n/2)){
 67             cout<<"NO"<<endl;
 68             exit(0);
 69         }
 70         int k=1;
 71         a[n/2+1][n/2+1]=f;
 72         for(int i=1;i<=n/2;i++){
 73             for(int j=1;j<=n/2;j++){
 74                 for(;k<=1000;){
 75                     if(num[k]>=4){
 76                         num[k]-=4;
 77                         a[i][j]=a[i][n-j+1]=a[n-i+1][j]=a[n-i+1][n-j+1]=k;
 78                         break;
 79                     } else{
 80                         k++;
 81                     }
 82                 }
 83             }
 84         }
 85         k=1;
 86         for(int i=1;i<=n/2;i++){
 87             for(;k<=1000;){
 88                 if(num[k]>=2){
 89                     a[i][n/2+1]=a[n-i+1][n/2+1]=k;
 90                     num[k]-=2;
 91                     break;
 92                 } else
 93                     k++;
 94             }
 95         }
 96         k=1;
 97         for(int i=1;i<=n/2;i++){
 98             for(;k<=1000;){
 99                 if(num[k]>=2){
100                     a[n/2+1][i]=a[n/2+1][n-i+1]=k;
101                     num[k]-=2;
102                     break;
103                 } else
104                     k++;
105             }
106         }
107         cout<<"YES"<<endl;
108         for(int i=1;i<=n;i++){
109             for(int j=1;j<=n;j++){
110                 cout<<a[i][j]<< ;
111             }
112             cout<<endl;
113         }
114     }
115 }
View Code

D:二分,和昨晚上eduC异曲同工之妙

技术图片
 1 #include <bits/stdc++.h>
 2 #define mk(a,b) make_pair(a,b)
 3 #define pii pair<int,int>
 4 using namespace std;
 5 typedef long long ll;
 6 const ll mod = 1e9+7;
 7 inline int read() {
 8     int X=0,w=1; char c=getchar();
 9     while (c<0||c>9) { if (c==-) w=-1; c=getchar(); }
10     while (c>=0&&c<=9) X=(X<<3)+(X<<1)+c-0,c=getchar();
11     return X*w;
12 }
13 const int N = 2e5+5;
14 int n,m,a[N];
15 bool cmp(int a,int b){
16     return a>b;
17 }
18 int check(int x){
19     ll ans=0;
20     for(int i=1;i<=n;i++){
21         int tmp=(i-1)/x;
22         if(a[i]-tmp<=0)
23             break;
24         ans+=a[i]-tmp;
25     }
26     return ans>=m;
27 }
28 int main(){
29     n=read();m=read();
30     ll sum=0;
31     for(int i=1;i<=n;i++){
32         a[i]=read();
33         sum+=a[i];
34     }
35     if(sum<m){
36         cout<<-1;
37         exit(0);
38     }
39     sort(a+1,a+1+n,cmp);
40     int l=1,r=n;
41     while (l<=r){
42         int mid=l+r>>1;
43         if(check(mid)){
44             r=mid-1;
45         } else{
46             l=mid+1;
47         }
48     }
49     cout<<l<<endl;
50 }
View Code

E:**题。

技术图片
 1 #include <bits/stdc++.h>
 2 #define mk(a,b) make_pair(a,b)
 3 #define pii pair<int,int>
 4 using namespace std;
 5 typedef long long ll;
 6 const ll mod = 1e9+7;
 7 inline int read() {
 8     int X=0,w=1; char c=getchar();
 9     while (c<0||c>9) { if (c==-) w=-1; c=getchar(); }
10     while (c>=0&&c<=9) X=(X<<3)+(X<<1)+c-0,c=getchar();
11     return X*w;
12 }
13 const int N = 1e5+5;
14 ll n,k;
15 void check(int x){
16     if(x==n)
17         exit(0);
18 }
19 int main(){
20     n=read();k=read();
21     if(n>k*k-k){
22         cout<<"NO";
23     } else{
24         cout<<"YES"<<endl;
25         int cnt=0;
26         for(int l=1;l<=k;l++){
27             for(int i=1;i+l<=k;i++){
28                 printf("%d %d\n",i,i+l);
29                 cnt++;
30                 check(cnt);
31             }
32             for(int i=k;i-l>=1;i--){
33                 printf("%d %d\n",i,i-l);
34                 cnt++;
35                 check(cnt);
36             }
37         }
38     }
39 }
View Code

F1:维护一下每颗子树里两种颜色的数量,然后枚举边

技术图片
 1 #include <bits/stdc++.h>
 2 #define mk(a,b) make_pair(a,b)
 3 #define pii pair<int,int>
 4 using namespace std;
 5 typedef long long ll;
 6 const ll mod = 1e9+7;
 7 inline int read() {
 8     int X=0,w=1; char c=getchar();
 9     while (c<0||c>9) { if (c==-) w=-1; c=getchar(); }
10     while (c>=0&&c<=9) X=(X<<3)+(X<<1)+c-0,c=getchar();
11     return X*w;
12 }
13 const int N = 3e5+5;
14 int n,s[N][2],a[N],x[N],y[N],dep[N];
15 vector<int> g[N];
16 void dfs(int v,int fa){
17     dep[v]=dep[fa]+1;
18     if(a[v]==1)
19         s[v][0]++;
20     if(a[v]==2)
21         s[v][1]++;
22     for(auto u:g[v]){
23         if(u==fa)continue;
24         dfs(u,v);
25         s[v][0]+=s[u][0];
26         s[v][1]+=s[u][1];
27     }
28 }
29 int main(){
30     n=read();
31     for(int i=1;i<=n;i++)
32         a[i]=read();
33     for(int i=1;i<n;i++){
34         x[i]=read();
35         y[i]=read();
36         g[x[i]].push_back(y[i]);
37         g[y[i]].push_back(x[i]);
38     }
39     dfs(1,0);
40     int ans=0;
41     for(int i=1;i<n;i++){
42         int u=x[i],v=y[i];
43         if(dep[u]>dep[v])
44             swap(u,v);
45         if(s[1][0]-s[v][0]==0||s[1][1]-s[v][1]==0){
46             if(s[v][0]==0||s[v][1]==0){
47                 ans++;
48             }
49         }
50     }
51     cout<<ans<<endl;
52 }
View Code

F2:好难不会哇。

 

R 540

标签:pre   clu   main   vector   c++   mes   一个   view   ext   

原文地址:https://www.cnblogs.com/MXang/p/10404255.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!