• 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
  • 相关阅读:
    礼品卡导入可用
    mysql
    初级运维工程师面试题总结
    mysql聚合函数
    去任何一个公司的思想
    mysql数据库引擎
    导入MyEclipse项目乱码
    poj 1743 后缀数组 求最长不重叠重复子串
    hdu 1011 树形dp+背包
    poj 2342 && hdu 1520 树形dp
  • 原文地址:https://www.cnblogs.com/si-rui-yang/p/9913482.html
Copyright © 2020-2023  润新知