R 540

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

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
",i,i+l);
29                 cnt++;
30                 check(cnt);
31             }
32             for(int i=k;i-l>=1;i--){
33                 printf("%d %d
",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:好难不会哇。

看的学长的代码,然后让另一个学长给我讲了讲。。。 

首先对于两个颜色相同的点 xy他们一定会被分到一起去,所以我们可以暴力把中间的点染色,顺便判一下无解的情况,就是中间夹着一个其他颜色的。

然后开始dp。

我们,(7个小时之后),好了,我现在又不会了。不管了。明早高铁摸了。

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 typedef long long ll;
  4 const ll mod = 998244353;
  5 void exgcd(ll a,ll b,ll& d,ll& x,ll& y) {
  6     if (!b) {
  7         d = a;
  8         x = 1;
  9         y = 0;
 10     } else {
 11         exgcd(b, a % b, d, y, x);
 12         y -= x * (a / b);
 13     }
 14 }
 15 ll inv(ll a, ll p) {
 16     ll d, x, y;
 17     exgcd(a, p, d, x, y);
 18     return d == 1 ? (x+p)%p : -1;
 19 }
 20 const int N = 3e5+5;
 21 vector<int> g[N],c[N];
 22 int par[N][22],dep[N];
 23 void dfs(int v,int fa){
 24     dep[v]=dep[fa]+1;
 25     par[v][0]=fa;
 26     for(int i=1;(1<<i)<=dep[fa];i++)
 27         par[v][i]=par[par[v][i-1]][i-1];
 28     for(auto u:g[v]){
 29         if(u==fa)continue;
 30         dfs(u,v);
 31     }
 32 }
 33 int lca(int x,int y){
 34     if(dep[x]>dep[y])swap(x,y);
 35     for(int i=20;i>=0;i--)
 36         if(dep[x]<=dep[y]-(1<<i))
 37             y=par[y][i];
 38     if(x==y)return x;
 39     for(int i=20;i>=0;i--){
 40         if(par[x][i]==par[y][i])continue;
 41         x=par[x][i],y=par[y][i];
 42     }
 43     return par[x][0];
 44 }
 45 int n,k,a[N];
 46 void slove(){
 47     for(int i=1;i<=k;i++){
 48         int lca_=c[i][0];
 49         for(auto u:c[i])
 50             lca_=lca(lca_,u);
 51         for(auto u:c[i]){
 52             if(u==lca_)continue;
 53             int v=u;
 54             while (v!=lca_){
 55                 v=par[v][0];
 56                 if(a[v]!=0&&a[v]!=i){
 57                     cout<<0<<endl;
 58                     exit(0);
 59                 }
 60                 if(a[v]==i)break;
 61                 a[v]=i;
 62             }
 63         }
 64     }
 65 }
 66 ll dp[N][2];
 67 void dfs2(int v,int fa){
 68     ll tmp=1;
 69     for(auto u:g[v]){
 70         if(u==fa)continue;
 71         dfs2(u,v);
 72         tmp=tmp*(dp[u][0]+dp[u][1])%mod;
 73     }
 74     if(a[v]==0){
 75         dp[v][0]=tmp;dp[v][1]=0;
 76         for(auto u:g[v]){
 77             if(u==fa)continue;
 78             ll x=tmp*inv(dp[u][0]+dp[u][1],mod)%mod;
 79             x=x*dp[u][1]%mod;
 80             dp[v][1]=(dp[v][1]+x)%mod;
 81         }
 82     } else{
 83         dp[v][0]=0;dp[v][1]=tmp;
 84     }
 85 }
 86 int main(){
 87     ios::sync_with_stdio(false);
 88     cin>>n>>k;
 89     for(int i=1;i<=n;i++){
 90         cin>>a[i];
 91         c[a[i]].push_back(i);
 92     }
 93     int x,y;
 94     for(int i=1;i<n;i++){
 95         cin>>x>>y;
 96         g[x].push_back(y);
 97         g[y].push_back(x);
 98     }
 99     dfs(1,0);
100     slove();
101     dfs2(1,0);
102     cout<<dp[1][1];
103 }
View Code
原文地址:https://www.cnblogs.com/MXang/p/10404255.html