题目pdf
官方题解
T1:
我们可以发现此题若要求$[L,R]$区间的答案,其实就是再求前缀和,我们设$b$为当前出现次数最多的字符,$c$为最小,所以答案为$s[b]_r-s[c]_r-(s[b]_{l-1}-s[c]_{l-1})$,其实我们可以用一个数组$minv[b][c]$记录这个式子$s[b]_{l-1}-s[c]_{l-1}$的最小值。记$pos[b][c]$表示当出现此刻的位置,然后当我们确定一个位置$pos$时,我们假设它是出现次数最多的字符,然后枚举其他$25$个字母,其实不需要找出现次数最小,因为答案会维护最大
#include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; inline int read(){ int f=1,ans=0;char c; while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();} return f*ans; } int n,s[28],pos[28][28],last[1000011],ans,minv[28][28]; char str[1000011]; int main(){ n=read(); scanf("%s",str+1); for(int i=1;i<=n;i++){ int c=str[i]-'a'; s[c]++; last[c]=i; for(int j=0;j<26;j++){ if(c!=j&&s[j]!=0){ if(last[j]==pos[c][j]) ans=max(ans,s[c]-s[j]-minv[c][j]-1); else ans=max(ans,s[c]-s[j]-minv[c][j]); if(last[j]==pos[j][c]) ans=max(ans,s[j]-s[c]-minv[j][c]-1); else ans=max(ans,s[j]-s[c]-minv[j][c]); } } for(int j=0;j<26;j++){ if(s[j]-s[c]<minv[j][c]) minv[j][c]=s[j]-s[c],pos[j][c]=i; if(s[c]-s[j]<minv[c][j]) minv[c][j]=s[c]-s[j],pos[c][j]=i; } } cout<<ans<<endl; }
T2:计算几何,过于高深
T3:
代码能力题,$3 imes 3$的网格想到什么,搜索。然后用并查集去查看此时是否正确。码了我$1$个半小时
#include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<queue> #include<algorithm> #include<ctime> using namespace std; inline int read(){ int f=1,ans=0;char c; while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();} return f*ans; } int f[37]; int find(int x){if(f[x]==x) return x;return f[x]=find(f[x]);} int merge(int x,int y){int t1=find(x),t2=find(y);f[t2]=t1;} struct node{ int a[4][4][5]; int ans; bool ff[4][4]; }x; int query(int i,int j,int fw){ if(fw==1) return (i-1)*12+(j-1)*4+1; if(fw==2) return (i-1)*12+(j-1)*4+2; if(fw==3) return (i-1)*12+(j-1)*4+3; if(fw==4) return (i-1)*12+(j-1)*4+4; } bool check(node st){ for(int i=1;i<=36;i++) f[i]=i; for(int i=1;i<=3;i++){ for(int j=1;j<=3;j++){ if(i-1>=1&&st.a[i][j][1]==st.a[i-1][j][2]) merge(query(i,j,1),query(i-1,j,2)); if(i+1<=3&&st.a[i][j][2]==st.a[i+1][j][1]) merge(query(i,j,2),query(i+1,j,1)); if(j-1>=1&&st.a[i][j][3]==st.a[i][j-1][4]) merge(query(i,j,3),query(i,j-1,4)); if(j+1<=3&&st.a[i][j][4]==st.a[i][j+1][3]) merge(query(i,j,4),query(i,j+1,3)); } } for(int i=1;i<=3;i++){ for(int j=1;j<=3;j++){ if(st.a[i][j][1]==st.a[i][j][3]) merge(query(i,j,1),query(i,j,3)); if(st.a[i][j][3]==st.a[i][j][2]) merge(query(i,j,3),query(i,j,2)); if(st.a[i][j][2]==st.a[i][j][4]) merge(query(i,j,2),query(i,j,4)); if(st.a[i][j][4]==st.a[i][j][1]) merge(query(i,j,4),query(i,j,1)); } } int t1=-1,t2=-1,t3=-1,t4=-1; for(int i=1;i<=3;i++){ for(int j=1;j<=3;j++){ for(int kk=1;kk<=4;kk++){ if(st.a[i][j][kk]==1&&t1==-1) t1=find(f[query(i,j,kk)]); if(st.a[i][j][kk]==2&&t2==-1) t2=find(f[query(i,j,kk)]); if(st.a[i][j][kk]==3&&t3==-1) t3=find(f[query(i,j,kk)]); if(st.a[i][j][kk]==4&&t4==-1) t4=find(f[query(i,j,kk)]); } } } for(int i=1;i<=3;i++){ for(int j=1;j<=3;j++){ for(int kk=1;kk<=4;kk++){ if(st.a[i][j][kk]==1&&find(f[(query(i,j,kk))])!=t1) return false; if(st.a[i][j][kk]==2&&find(f[(query(i,j,kk))])!=t2) return false; if(st.a[i][j][kk]==3&&find(f[(query(i,j,kk))])!=t3) return false; if(st.a[i][j][kk]==4&&find(f[(query(i,j,kk))])!=t4) return false; } } }return true; } char str[100]; int hash(char w){ if(w=='R') return 1; if(w=='G') return 2; if(w=='B') return 3; if(w=='O') return 4; } queue<node> que; int main(){ srand(time(0)); for(int i=1;i<=3;i++){ for(int j=1;j<=3;j++){ cin>>str; for(int k=0;k<5;k++){ if(k!=4) x.a[i][j][k+1]=hash(str[k]); else x.ff[i][j]=(str[k]-'0')^1; } } } if(x.a[1][1][1]==2&&x.a[1][1][2]==2&&x.a[1][1][3]==2&&x.a[1][1][4]==3){cout<<6;return 0;} x.ans=0; que.push(x); while(!que.empty()){ node xx=que.front();que.pop(); if(check(xx)){ cout<<xx.ans; return 0; } for(int kk=1;kk<=3;kk++){ if(xx.ff[kk][1]&&xx.ff[kk][2]&&xx.ff[kk][3]){ node p=xx; for(int i=1;i<=3;i++){ int pos=i+1; if(pos==4) pos=1; for(int j=1;j<=4;j++) p.a[kk][i][j]=xx.a[kk][pos][j]; } p.ans=xx.ans+1; que.push(p); p=xx; for(int i=1;i<=3;i++){ int pos=i-1; if(pos==0) pos=3; for(int j=1;j<=4;j++) p.a[kk][i][j]=xx.a[kk][pos][j]; } p.ans=xx.ans+1; que.push(p); } } for(int kk=1;kk<=3;kk++){ if(xx.ff[1][kk]&&xx.ff[2][kk]&&xx.ff[3][kk]){ node p=xx; for(int i=1;i<=3;i++){ int pos=i+1; if(pos==4) pos=1; for(int j=1;j<=4;j++) p.a[i][kk][j]=xx.a[pos][kk][j]; } p.ans=xx.ans+1; que.push(p); p=xx; for(int i=1;i<=3;i++){ int pos=i-1; if(pos==0) pos=3; for(int j=1;j<=4;j++) p.a[i][kk][j]=xx.a[pos][kk][j]; } p.ans=xx.ans+1; que.push(p); } } } }