好久没写题解了嘻嘻嘻,昨天补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 }
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 }
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 }
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 }
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 }
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 }
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 }