zoukankan      html  css  js  c++  java
  • Codeforces Round #568 (Div. 2)网卡&垫底记

    这场和div3差不多嘛(后来发现就是div3),就是网太卡10min交一发就不错了,简直自闭。

    A

    签到。

    B

    记录每一段的字母数,满足条件即:段数相同+字母相同+字母数下>=上。

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e6+7;
    char a[N],b[N];
    int n,m,n1,n2,c1[N],s1[N],c2[N],s2[N];
    bool check()
    {
        int now=0;
        n1=n2=0;
        for(int i=1;i<=n;i++)if(i==1||a[i]!=a[i-1])c1[++n1]=a[i],s1[n1]=1;
        else s1[n1]++;
        for(int i=1;i<=m;i++)if(i==1||b[i]!=b[i-1])c2[++n2]=b[i],s2[n2]=1;
        else s2[n2]++;
        if(n1!=n2)return 0;
        for(int i=1;i<=n1;i++)if(c1[i]!=c2[i]||s1[i]>s2[i])return 0;
        return 1;
    }
    int main()
    {
        int T;scanf("%d",&T);
        while(T--)
        {
            scanf("%s",a+1),n=strlen(a+1);
            scanf("%s",b+1),m=strlen(b+1);
            if(check())puts("YES");else puts("NO");
        }
    }
    View Code

    C

    签到。不知设成C1和C2除了卡网速还有什么意义?根据ti<=100,直接数组维护每种t出现的次数,然后从大到小贪心删。不知为啥这签到题有人用treap?还T了?

    #include<bits/stdc++.h>
    using namespace std;
    const int N=2e5+7;
    int n,m,a[N],s[N],num[102];
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)scanf("%d",&a[i]),s[i]=s[i-1]+a[i];
        for(int i=1;i<=n;i++)
        if(s[i]<=m)printf("0 "),num[a[i]]++;
        else{
            int rest=s[i]-m,ans=0;
            for(int j=100;j;j--)if(j*num[j]<rest)rest-=j*num[j],ans+=num[j];
            else{ans+=(rest+j-1)/j;break;}
            printf("%d ",ans);
            num[a[i]]++;
        }
    }
    View Code

    D

    把数列排个序,讨论删队头和队尾,其余的差分维护下即可。忘讨论还WA了两发。

    #include<bits/stdc++.h>
    using namespace std;
    const int N=2e5+7;
    struct node{int id,v;}a[N];
    int n,d[N],l[N],r[N];
    bool cmp(node a,node b){return a.v<b.v;}
    bool judge1()
    {
        for(int i=3;i<n;i++)if(d[i]!=d[2])return 0;
        return 1;
    }
    bool judge2()
    {
        for(int i=2;i<n-1;i++)if(d[i]!=d[1])return 0;
        return 1;
    }
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)scanf("%d",&a[i].v),a[i].id=i;
        sort(a+1,a+n+1,cmp);
        for(int i=1;i<n;i++)d[i]=a[i+1].v-a[i].v;
        if(judge1()){printf("%d",a[1].id);return 0;}
        if(judge2()){printf("%d",a[n].id);return 0;}
        l[1]=1;for(int i=2;i<n;i++)if(d[i]==d[i-1])l[i]=1;else break;
        r[n-1]=1;for(int i=n-2;i;i--)if(d[i]==d[i+1])r[i]=1;else break;
        if(r[3]&&d[1]+d[2]==d[3]){printf("%d",a[2].id);return 0;}
        if(l[n-3]&&d[n-1]+d[n-2]==d[n-3]){printf("%d",a[n-1].id);return 0;}
        for(int i=3;i<=n-2;i++)if(l[i-2]&&r[i+1]&&d[1]==d[n-1]&&d[i-1]+d[i]==d[1])
        {printf("%d",a[i].id);return 0;}
        puts("-1");
    }
    View Code

    E

    写&交这题时网均卡了至少10min,导致我被Gloid吊打(虽然不卡还是被吊打)。就是每种字母分别枚举一下,然后直接做即可。

    #include<bits/stdc++.h>
    using namespace std;
    const int N=2002;
    int n,m,r1[27],c1[27],r2[27],c2[27],hr[N],hc[N];
    char mp[N][N];
    bool judge(int x)
    {
        int sr=0,sc=0;
        for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        if(mp[i][j]=='a'+x-1)
        {
            if(!hr[i])hr[i]=1,sr++;
            if(!hc[j])hc[j]=1,sc++;
        }
        if(sr>1&&sc>1)return 0;
        if(!sr&&!sc){r1[x]=r2[x]=r1[x+1],c1[x]=c2[x]=c1[x+1];return 1;}
        if(sr==1&&sc==1)
        {
            for(int i=1;i<=n;i++)if(hr[i])hr[i]=0,r1[x]=r2[x]=i;
            for(int i=1;i<=m;i++)if(hc[i])hc[i]=0,c1[x]=c2[x]=i;
            return 1;
        }
        if(sr==1)
        {
            for(int i=1;i<=n;i++)if(hr[i])r1[x]=r2[x]=i;
            for(int i=1;i<=m;i++)if(mp[r1[x]][i]=='a'+x-1){c1[x]=i;break;}
            for(int i=m;i;i--)if(mp[r1[x]][i]=='a'+x-1){c2[x]=i;break;}
            for(int i=c1[x];i<=c2[x];i++)if(mp[r1[x]][i]<'a'+x-1)return 0;
        }
        if(sc==1)
        {
            for(int i=1;i<=m;i++)if(hc[i])c1[x]=c2[x]=i;
            for(int i=1;i<=n;i++)if(mp[i][c1[x]]=='a'+x-1){r1[x]=i;break;}
            for(int i=n;i;i--)if(mp[i][c1[x]]=='a'+x-1){r2[x]=i;break;}
            for(int i=r1[x];i<=r2[x];i++)if(mp[i][c1[x]]<'a'+x-1)return 0;
        }
        for(int i=r1[x];i<=r2[x];i++)hr[i]=0;
        for(int j=c1[x];j<=c2[x];j++)hc[j]=0;
        return 1;
    }
    int main()
    {
        int T;scanf("%d",&T);
        while(T--)
        {
            scanf("%d%d",&n,&m);
            for(int i=1;i<=n;i++)hr[i]=0;
            for(int j=1;j<=m;j++)hc[j]=0;
            for(int i=1;i<=n;i++)scanf("%s",mp[i]+1);
            int mx=0;
            for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
            if(mp[i][j]>='a'&&mp[i][j]<='z')mx=max(mx,mp[i][j]-'a'+1);
            if(!mx){puts("YES
    0");continue;}
            for(int i=mx;i;i--)if(!judge(i)){mx=0;break;}
            if(!mx){puts("NO");continue;}
            printf("YES
    %d
    ",mx);
            for(int i=1;i<=mx;i++)printf("%d %d %d %d
    ",r1[i],c1[i],r2[i],c2[i]);
        }
    }
    View Code

    F

    签到,把每种馅料压缩成一个二进制位,枚举。这根本不能称之为题目。

    #include<bits/stdc++.h>
    using namespace std;
    int n,m,ans,ans1,ans2,a[512],mn[512],id[512];
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
        {
            int x,y,S=0;scanf("%d",&x);
            while(x--)scanf("%d",&y),S|=1<<y-1;
            a[S]++;
        }
        for(int i=0;i<512;i++)mn[i]=1e9+7;
        for(int i=1;i<=m;i++)
        {
            int c,x,y,S=0;scanf("%d%d",&c,&x);
            while(x--)scanf("%d",&y),S|=1<<y-1;
            if(mn[S]>c)mn[S]=c,id[S]=i;
        }
        ans=-1;
        for(int i=0;i<511;i++)
        for(int j=i+1;j<512;j++)
        if(mn[i]<1e9+7&&mn[j]<1e9+7)
        {
            int sum=0;
            for(int k=0;k<512;k++)if(((i|j)&k)==k)sum+=a[k];
            if(sum>ans)ans=sum,ans1=i,ans2=j;
            else if(sum==ans&&mn[ans1]+mn[ans2]>mn[i]+mn[j])ans1=i,ans2=j;
        }
        if(ans==-1)puts("1 2");
        else printf("%d %d",id[ans1],id[ans2]);
    }
    View Code

    G

    G1裸状压DP即可,不知这G1给2750分是啥意思?

    咕了的G2终于写了。看大佬们各种常数小的暴力跑过,我也来写了一发暴力。注意g[i]<=3,可以考虑把其拆成3个背包,f[0/1/2][i][j]表示第0/1/2类,选了i件物品,体积和为j的方案数,直接暴力DP即可。然后可以枚举前两个背包的i和j,第三个背包的k,然后只需要预处理出s[i][j][k]表示每一类分别是i、j、k个物品的合法排列方案数,复杂度O(T^2*n^3),准确说是O(T^2*n^3/54)≈O(T^2*n^2),但是中途搜索排除了一些dp值为0的情况,所以实际复杂度明显比这小。

    #include<bits/stdc++.h>
    using namespace std;
    const int N=52,mod=1e9+7;
    int n,T,ans,f[3][N][N*N],g[3][N][N][N],s[N][N][N],fac[N];
    vector<int>G[3];
    void add(int&x,int y){x=x+y>=mod?x+y-mod:x+y;}
    int main()
    {
        scanf("%d%d",&n,&T);
        fac[0]=1;for(int i=1;i<=n;i++)fac[i]=1ll*fac[i-1]*i%mod;
        s[0][0][0]=g[0][1][0][0]=g[1][0][1][0]=g[2][0][0][1]=1;
        for(int i=0;i<n;i++)
        for(int j=0;i+j<n;j++)
        for(int k=0;i+j+k<n;k++)
        for(int l=0;l<3;l++)
        if(g[l][i][j][k])
        {
            if(l!=0)add(g[0][i+1][j][k],g[l][i][j][k]);
            if(l!=1)add(g[1][i][j+1][k],g[l][i][j][k]);
            if(l!=2)add(g[2][i][j][k+1],g[l][i][j][k]);
        }
        for(int i=0;i<=n;i++)
        for(int j=0;i+j<=n;j++)
        for(int k=0;i+j+k<=n;k++)
        if(i||j||k)
        s[i][j][k]=(1ll*g[0][i][j][k]+g[1][i][j][k]+g[2][i][j][k])%mod*fac[i]%mod*fac[j]%mod*fac[k]%mod;
        for(int i=1,x,y;i<=n;i++)scanf("%d%d",&x,&y),G[y-1].push_back(x);
        for(int i=0;i<3;i++)
        {
            f[i][0][0]=1;
            for(int p=0;p<G[i].size();p++)
            {
                int t=G[i][p];
                for(int j=G[i].size()-1;~j;j--)
                for(int k=0;k<=T-t;k++)add(f[i][j+1][k+t],f[i][j][k]);
            }
        }
        for(int i=0;i<=G[0].size();i++)
        for(int t0=0;t0<=T;t0++)
        if(f[0][i][t0])
        for(int j=0;j<=G[1].size();j++)
        for(int t1=0;t0+t1<=T;t1++)
        if(f[1][j][t1])
        for(int k=0;k<=G[2].size();k++)
        if(f[2][k][T-t0-t1])
        add(ans,1ll*f[0][i][t0]*f[1][j][t1]%mod*f[2][k][T-t0-t1]%mod*s[i][j][k]%mod);
        printf("%d",ans);
    }
    View Code

    强烈谴责出题人,这题目难度排列顺序十分不合理。其实本场CF要是作为div2,应该删了C1、F和G1才正常,不过毕竟本来是作为div3的嘛,怪自己打完才发现。

    result:rank37,以为上不了橙结果rating=2106,压线上橙,好啊好啊。不过rank1的Gloid(即poorinenglish)不知道为啥被ban了?

    感觉这场就是比网速+开题顺序的。先开F/G1的人赢了。幸好这是小号吧(不过大号都unrated也无所谓了)。

  • 相关阅读:
    ubuntu操作技巧
    电机
    哈佛结构与冯若依曼结构
    linux command ------ ls
    Frames of Reference参考框架
    What Are Tango Poses?Tango姿态是什么?
    Google Tango Java SDK开发:Motion Tracking 运动追踪
    Google Tango Java SDK开发:Configure and Connect 配置和连接
    gradle
    Google Tango service outdated谷歌Tango的服务过时了
  • 原文地址:https://www.cnblogs.com/hfctf0210/p/11056542.html
Copyright © 2011-2022 走看看