B
如果同时存在0 1 两种数据,那么每个数可以去到随意一个位置。
如果只存在0 1 其中一种数据,那么位置之间不能交换,只能判断数组本身是否递增。
#include <bits/stdc++.h> #define debug freopen("r.txt","r",stdin) #define mp make_pair #define ri register int using namespace std; typedef long long ll; typedef pair<int, int> pii; const int maxn = 505; const int INF = 0x3f3f3f3f; const int mod = 998244353; inline ll read(){ll s=0,w=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();} while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar(); return s*w;} ll qpow(ll p,ll q){return (q&1?p:1)*(q?qpow(p*p%mod,q/2):1)%mod;} struct node { int x,y; }; int t,n,i,flag; node a[maxn]; int main() { t=read(); while (t--) { n=read(); for (i=1;i<=n;i++) a[i].x=read(); for (i=1;i<=n;i++) a[i].y=read(); set<int> s; for (i=1;i<=n;i++) s.insert(a[i].y); if (s.size()==2) cout<<"Yes"<<endl; else { flag=1; for (i=1;i<n;i++) if (a[i].x>a[i+1].x) { flag=false; break; } if (flag) cout<<"Yes"<<endl; else cout<<"No"<<endl; } } return 0; }
C
枚举每个数,假设这个数最后是匹配的,那么算出它要移动的距离是多少,其中,用一个桶数组统计有多少个数是移动了相同距离的。
#include <bits/stdc++.h> #define debug freopen("r.txt","r",stdin) #define mp make_pair #define ri register int using namespace std; typedef long long ll; typedef pair<int, int> pii; const int maxn = 2e5+10; const int INF = 0x3f3f3f3f; const int mod = 998244353; inline ll read(){ll s=0,w=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();} while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar(); return s*w;} ll qpow(ll p,ll q){return (q&1?p:1)*(q?qpow(p*p%mod,q/2):1)%mod;} int n,i,x,a[maxn],ans[maxn],maxx; int main() { n=read(); for (i=1;i<=n;i++) { x=read(); a[x]=i; } for (i=1;i<=n;i++) { x=read(); if (i<=a[x]) ans[a[x]-i]++; else if (i>a[x]) ans[n-i+a[x]]++; } for (i=0;i<n;i++) maxx=max(maxx,ans[i]); cout<<maxx<<endl; return 0; }
D
①把坏人上下左右围起来,如果好人就在坏人身边,那么好人怎么走,坏人能跟着好人。
②统计好人个数,如果出口被封,那么图里面没有好人的话也是可以输出Yes的
③从出口处开始搜索,找到所有能找到的好人为止,最后判断好人有没有找全。
#include <bits/stdc++.h> #define debug freopen("r.txt","r",stdin) #define mp make_pair #define ri register int using namespace std; typedef long long ll; typedef pair<int, int> pii; const int maxn = 105; const int INF = 0x3f3f3f3f; const int mod = 998244353; const int dx[4]={0,0,1,-1}; const int dy[4]={1,-1,0,0}; inline ll read(){ll s=0,w=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();} while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar(); return s*w;} ll qpow(ll p,ll q){return (q&1?p:1)*(q?qpow(p*p%mod,q/2):1)%mod;} int n,m; char s[maxn][maxn]; void solve() { int num=0; queue<pii>q; for (ri i=1;i<=n;i++) for (ri j=1;j<=m;j++) if (s[i][j]=='B') { for (ri k=0;k<4;k++) { int xx=dx[k]+i; int yy=dy[k]+j; if (xx>=1 && xx<=n && yy>=1 && yy<=m) { if (s[xx][yy]=='.') s[xx][yy]='#'; else if (s[xx][yy]=='G') { cout<<"No"<<endl; return; } } } } else if (s[i][j]=='G') num++; if (s[n][m]=='#') { if (num==0) cout<<"Yes"<<endl; else cout<<"No"<<endl; return; } q.push(mp(n,m)); s[n][m]='#'; while (!q.empty()) { pii now=q.front(); q.pop(); for (ri i=0;i<4;i++) { int xx=dx[i]+now.first; int yy=dy[i]+now.second; if (xx>=1 && xx<=n && yy>=1 && yy<=m) if (s[xx][yy]!='#') { if (s[xx][yy]=='G')num--; q.push(mp(xx,yy)); s[xx][yy]='#'; } } } if (num==0) cout<<"Yes"<<endl; else cout<<"No"<<endl; } int main() { int t; t=read(); while (t--) { n=read(),m=read(); for (int i=1;i<=n;i++) scanf("%s",s[i]+1); solve(); } return 0; }
E
对于n<=3,那么怎么选都是选n个;
对于n>3,那么怎么选都是选3个;因为选4个的话,如果想对结果不产生不利影响,则需要原有3个在这个位置上为1,且第四个也在这个位置有1。这样的话,加进来的这个数,不会产生价值,只存在原值不变和原值减小。
#include <bits/stdc++.h> #define debug freopen("r.txt","r",stdin) #define mp make_pair #define ri register int using namespace std; typedef long long ll; typedef pair<int, int> pii; const int maxn = 505; const int INF = 0x3f3f3f3f; const int mod = 998244353; inline ll read(){ll s=0,w=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();} while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar(); return s*w;} ll qpow(ll p,ll q){return (q&1?p:1)*(q?qpow(p*p%mod,q/2):1)%mod;} int n,i,j,k; ll ans,a[maxn]; int main() { n=read(); for (i=1;i<=n;i++) a[i]=read(); for (i=1;i<=n;i++) for (j=1;j<=n;j++) for (k=1;k<=n;k++) ans=max(ans,a[i]|a[j]|a[k]); cout<<ans<<endl; return 0; }