好久没写题解了嘻嘻嘻,昨天补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 }
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\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 }
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:好难不会哇。
原文:https://www.cnblogs.com/MXang/p/10404255.html