蒟蒻就切了四道水题,然后EF看着可写然而并不会,中间还WA了一次,我太菜了.jpg =。=
A.Vasya And Password
一开始看着有点虚没敢立刻写,后来写完第二题发现可以暴力讨论,因为保证有解,没了
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N=105; 6 char rd[N]; 7 int main () 8 { 9 int T; 10 scanf("%d",&T); 11 while(T--) 12 { 13 scanf("%s",rd); 14 int c1=0,c2=0,c3=0,len=strlen(rd); 15 for(int i=0;i<len;i++) 16 { 17 if(rd[i]>='0'&&rd[i]<='9') c1++; 18 if(rd[i]>='A'&&rd[i]<='Z') c2++; 19 if(rd[i]>='a'&&rd[i]<='z') c3++; 20 } 21 if(!c1&&!c2&&c3) 22 rd[0]='0',rd[1]='A'; 23 else if(!c1&&c2&&!c3) 24 rd[0]='0',rd[1]='a'; 25 else if(c1&&!c2&&!c3) 26 rd[0]='a',rd[1]='A'; 27 else if(c1&&c2&&!c3) 28 { 29 if(c1>1) 30 { 31 for(int i=0;i<len;i++) 32 if(rd[i]>='0'&&rd[i]<='9') {rd[i]='a';break;} 33 } 34 else if(c2>1) 35 { 36 for(int i=0;i<len;i++) 37 if(rd[i]>='A'&&rd[i]<='Z') {rd[i]='a';break;} 38 } 39 } 40 else if(c1&&!c2&&c3) 41 { 42 if(c1>1) 43 { 44 for(int i=0;i<len;i++) 45 if(rd[i]>='0'&&rd[i]<='9') {rd[i]='A';break;} 46 } 47 else if(c3>1) 48 { 49 for(int i=0;i<len;i++) 50 if(rd[i]>='a'&&rd[i]<='z') {rd[i]='A';break;} 51 } 52 } 53 else if(!c1&&c2&&c3) 54 { 55 if(c3>1) 56 { 57 for(int i=0;i<len;i++) 58 if(rd[i]>='a'&&rd[i]<='z') {rd[i]='0';break;} 59 } 60 else if(c2>1) 61 { 62 for(int i=0;i<len;i++) 63 if(rd[i]>='A'&&rd[i]<='Z') {rd[i]='0';break;} 64 } 65 } 66 for(int i=0;i<len;i++) printf("%c",rd[i]); printf("\n"); 67 } 68 return 0; 69 }
B.Relatively Prime Pairs
想了一会一拍脑袋,这题\*\*这么水还想啥,输出相邻数字,没了
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 long long l,r; 6 int main () 7 { 8 scanf("%lld%lld",&l,&r); 9 printf("YES\n"); 10 for(long long i=l;i<=r;i+=2) 11 printf("%lld %lld\n",i,i+1); 12 return 0; 13 }
C.Vasya and Multisets
需要稍微想一想的题,然而本质上还是个分类讨论
考虑每种数字出现不同次数带来的影响,出现一次的一定对一个集合有贡献,出现两次的怎么放都没有影响,出现三次及以上的可以令它对一个集合有贡献,也可以令它没有影响
所以首先除去所有出现两次的数(都丢给一个集合即可),然后看看出现一次的有奇数个还是偶数个。如果有奇数个且没有出现三次以上的则无解;如果有奇数个且有出现三次及以上的就先两两分开出现一次的,把剩下那个放在一个集合,出现三次及以上的一个数放一个在另一个集合,然后剩下的一股脑丢在一个集合里;如果有偶数个就凉凉分开然后剩下的直接丢在一个集合里
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N=105; 6 long long num[N],cnt[N]; 7 char outp[N]; 8 bool used[N]; 9 long long n,und,ans,k; 10 int main () 11 { 12 scanf("%lld",&n); 13 for(int i=1;i<=n;i++) 14 scanf("%lld",&num[i]),cnt[num[i]]++; 15 for(int i=1;i<=100;i++) 16 if(cnt[i]==2) 17 { 18 for(int j=1;j<=n;j++) 19 if(num[j]==i) used[j]=1,outp[j]='A'; 20 } 21 else if(cnt[i]>=3) 22 { 23 und++; 24 for(int j=1;j<=n;j++) 25 if(num[j]==i) used[j]=1; 26 } 27 // for(int i=1;i<=n;i++) printf("%c",outp[i]); 28 for(int i=1;i<=n;i++) if(!used[i]) ans++,outp[i]=(k^=1)?'A':'B'; 29 if((ans&1)&&!und) {printf("NO");return 0;} 30 else 31 { 32 if((ans&1)==0) 33 {for(int i=1;i<=n;i++) if(used[i]) outp[i]='A'; 34 } 35 else 36 { 37 bool flag=true; 38 for(int i=1;i<=n;i++) if(used[i]&&cnt[num[i]]!=2) 39 { 40 if(flag)outp[i]='B',flag=false; 41 else outp[i]='A'; 42 } 43 } 44 } 45 printf("YES\n"); 46 for(int i=1;i<=n;i++) 47 printf("%c",outp[i]); 48 return 0; 49 }
D.Bicolorings
递推题,画图推式子即可
设$rec[i][j][0/1][0/1]$表示到第$i$列分出了$j$块,且第$i$列上面为白/黑,下面为白/黑的方案数,这样就足够递推了,讨论新加入的两块与之前的联通情况即可
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N=1005; 6 const long long mod=998244353; 7 long long rec[N][2*N][2][2]; 8 long long n,m; 9 int main () 10 { 11 scanf("%lld%lld",&n,&m); 12 rec[1][1][0][0]=rec[1][1][1][1]=1; 13 rec[1][2][1][0]=rec[1][2][0][1]=1; 14 for(int i=2;i<=n;i++) 15 for(int j=1;j<=2*i;j++) 16 { 17 rec[i][j][0][0]+=rec[i-1][j][0][1]+rec[i-1][j][1][0]+rec[i-1][j][0][0]+rec[i-1][j-1][1][1]; 18 rec[i][j][1][1]+=rec[i-1][j][1][0]+rec[i-1][j][0][1]+rec[i-1][j][1][1]+rec[i-1][j-1][0][0]; 19 rec[i][j][0][1]+=rec[i-1][j][0][1]+rec[i-1][j-1][0][0]+rec[i-1][j-1][1][1]; if(j>=2) rec[i][j][0][1]+=rec[i-1][j-2][1][0]; 20 rec[i][j][1][0]+=rec[i-1][j][1][0]+rec[i-1][j-1][0][0]+rec[i-1][j-1][1][1]; if(j>=2) rec[i][j][1][0]+=rec[i-1][j-2][0][1]; 21 rec[i][j][0][0]%=mod;rec[i][j][1][1]%=mod;rec[i][j][0][1]%=mod;rec[i][j][1][0]%=mod; 22 } 23 printf("%lld",(rec[n][m][0][0]+rec[n][m][1][1]+rec[n][m][0][1]+rec[n][m][1][0])%mod); 24 return 0; 25 }
E.