X day1

题目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;
}
View Code

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);
            }
        }
    }
}
View Code
原文地址:https://www.cnblogs.com/si-rui-yang/p/9913482.html