B.
按要求建图,判欧拉路径
#include<bits/stdc++.h> using namespace std; const int maxn=1e6+14; //vector<int> g[maxn]; int N,M; int T; int x; char s[maxn]; int inDegree[maxn]; int father[maxn]; int isRoot[maxn]; int findfather(int x) { int a=x; while(x!=father[x]) x=father[x]; while(a!=father[a]) { int z=a; a=father[a]; father[z]=x; } return x; } void Union (int a,int b) { int faA=findfather(a); int faB=findfather(b); if (faA!=faB) father[faA]=faB; } int main () { scanf("%d",&T); while(T--) { memset(inDegree,0,sizeof(inDegree)); memset(isRoot,0,sizeof(isRoot)); scanf("%d %d",&N,&M); for (int i=0;i<N*M;i++) father[i]=i; for (int i=0;i<N;i++) for (int j=0;j<M;j++) cin>>s[i*M+j]; for (int i=0;i<N;i++) { for (int j=0;j<M;j++) { scanf("%d",&x); if (s[i*M+j]=='u') { if (i-x<0) continue; inDegree[(i-x)*M+j]++; Union(i*M+j,(i-x)*M+j); } else if (s[i*M+j]=='d') { if (i+x>=N) continue; inDegree[(i+x)*M+j]++; Union(i*M+j,(i+x)*M+j); } else if (s[i*M+j]=='l') { if (j-x<0) continue; inDegree[(i*M+j-x)]++; Union(i*M+j,i*M+j-x); } else if (s[i*M+j]=='r') { if (j+x>=M) continue; inDegree[i*M+j+x]++; Union(i*M+j,i*M+j+x); } } } int ans=0; for (int i=0;i<N*M;i++) isRoot[findfather(i)]++; for (int i=0;i<N*M;i++) if (isRoot[i]) ans++; //printf("%d\n",ans); if (ans>1) { printf("No\n"); continue; } int cnt=0; for (int i=0;i<N*M;i++) { if (inDegree[i]==0) cnt++; } if (cnt>=2) printf("No\n"); else printf("Yes\n"); } return 0; }
C.
构造
#include<bits/stdc++.h> using namespace std; const int maxn=1e6+14; typedef long long ll; ll a[5]; string s; int main () { int T; scanf("%d",&T); while (T--) { for (int i=0;i<4;i++) a[i]=0; cin>>s; ll len=s.length(); for (int i=0;i<len;i++) { if (s[i]=='0') a[0]++; if (s[i]=='6') a[1]++; if (s[i]=='8') a[2]++; if (s[i]=='9') a[3]++; } ll ans=(1+len)*(ll)len/2+1; ans-=(1+a[0])*a[0]/2;//0 ans-=(1+a[2])*a[2]/2;//8 ans-=a[1]*a[3];//69 if (a[1]==len||a[3]==len) ans--; printf("%lld\n",ans); } return 0; }
D.
套个二分
#include<bits/stdc++.h> using namespace std; const int maxn=1e6+14; string s; int a[maxn]; int b[maxn]; int len; int cal (int l) { int ans=0; for (int i=1;i<=len;i++) { if (a[i]==1) { ans++; for (int j=i;j<i+l;j++) if (a[j]) a[j]=0; } } return ans; } int main () { int T,N,K; scanf("%d",&T); while(T--) { scanf("%d%d",&N,&K); memset(a,0,sizeof(a)); cin>>s; for (int i=1;i<=s.length();i++) a[i]=s[i-1]=='1',b[i]=a[i]; len=s.length(); int l=1; int r=len; while (l<r) { int mid=(l+r)>>1; for (int i=1;i<=len;i++) a[i]=b[i]; int ans=cal(mid); if (ans>K) l=mid+1; else { r=mid; } } printf("%d\n",l); } return 0; }