• Codeforces Round #375 (Div.2)


    723A - The New Year: Meeting Friends

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    int main()
    {
        int x[3];
        scanf("%d%d%d",&x[0],&x[1],&x[2]);
        sort(x,x+3);
        printf("%d",x[2]-x[0]);
        return 0;
    }

    723B - Text Document Analysis

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    const int N=300;
    char c[N];
    int main()
    {
        int n,ans1=0,ans2=0;
        scanf("%d%s",&n,c);
        for(int i=0,zt=0,sl=0,len=0;i<n;++i)
        {
            if(c[i]=='(') zt=1,sl=0,len=0;
            else if(c[i]==')') 
            {
                if(len>0) ++ans2;
                zt=len=0;
            }
            else if(c[i]=='_'&&zt) 
            {
                if(len>0) ++ans2;
                len=0;
            }
            else if(c[i]=='_') len=0;
            else if(c[i]!='_'&&!zt) ans1=max(++len,ans1);
            else ++len;
        }
        printf("%d %d",ans1,ans2);
        return 0;
    }

    723C - Polycarp at the Radio

    #include<cstdio>
    #include<vector>
    using namespace std;
    const int N=2005;
    int a[N],to[N],wz[N],s;
    int main()
    {
        int n,m,yq,cs=0;
        scanf("%d%d",&n,&m);
        yq=n/m;
        for(int i=1;i<=n;++i) 
        {
            scanf("%d",&a[i]);
            if(a[i]>m||to[a[i]]>=yq) wz[++s]=i;
            else ++to[a[i]];
        }
        for(int i=1;i<=m;++i)
                while(to[i]<yq)
                {
                    ++to[i];
                    a[wz[s--]]=i;
                    ++cs;
                }
        printf("%d %d
    ",yq,cs);
        for(int i=1;i<=n;++i)
            printf("%d ",a[i]);
        return 0;
    }

    723D - Lakes in Berland

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    char c[55][55];
    int sl,bx[4]={1,-1},by[4]={0,0,1,-1},n,m;
    bool vis[55][55];
    struct A
    {
        int a,b;
    }q[2505],st[2505],dx[2505];
    bool cmp(const A &t1,const A &t2)
    {
        return t1.a<t2.a;
    }
    void drow_it(A wz)
    {
        c[wz.a][wz.b]='*';
        for(int i=0;i<4;++i)
        {
            int ba=wz.a+bx[i],bb=wz.b+by[i];
            if(ba>0&&bb>0&&ba<=n&&bb<=m&&c[ba][bb]!='*') drow_it((A){ba,bb});
        }
    }
    int main()
    {
        int k,ans=0;
        scanf("%d%d%d",&n,&m,&k);
        for(int i=1;i<=n;++i)
            scanf("%s",c[i]+1);
        for(int i=1;i<=n;++i)
            for(int j=1;j<=m;++j)
                if(c[i][j]!='*'&&!vis[i][j])
                {
                    int t=0,w=1;
                    bool sf=i!=1&&j!=1&&i!=n&&j!=m;
                    q[0].a=i,q[0].b=j;
                    vis[i][j]=1;
                    for(;t<w;++t)
                        for(int o=0;o<4;++o)
                        {
                            int ba=q[t].a+bx[o],bb=q[t].b+by[o];
                            if(ba>0&&bb>0&&ba<=n&&bb<=m&&c[ba][bb]!='*'&&!vis[ba][bb])
                            {
                                vis[ba][bb]=1;
                                q[w++]=(A){ba,bb};
                                if(ba==1||bb==1||ba==n||bb==m) sf=0;
                            }
                        }
                    if(sf) dx[++sl].a=w,st[dx[sl].b=sl]=(A){i,j};
                }
        sort(dx+1,dx+sl+1,cmp);
        for(int i=1;sl>k;++i,--sl) 
            ans+=dx[i].a,drow_it(st[dx[i].b]);
        printf("%d
    ",ans);
        for(int i=1;i<=n;++i) printf("%s
    ",c[i]+1);
        return 0;
    }

    723E - One-Way Reform

     题面大意:给一个n个点m条边的图,将这些双向边改为单向边,尽量使出度等于入度的点多,输出所有边的方向。

    解法:

    对于度为奇数的点的数量一定为偶数,编号为1,。。。,k

    将1-2,3-4,。。。,k-1-k连一条边

    它就变成了一个欧拉回路,因此,我们可以dfs对于图中原有的边输出经过的方向,而且入度真正等于出度的点只有度数为偶数的点。

    #include<cstdio>
    #include<cstring>
    const int N=205;
    struct X
    {
        int v,n,f;
        bool vis,re;
    }x[80005];
    int s,d[N],j[N],v[N];
    void add(int u,int v,bool re)
    {
        x[++s].n=x[u].f;
        x[x[u].f=s].v=v;
        x[s].re=re;
    }
    void dfs(int u)
    {
        v[u]=1;
        for(int i=x[u].f;i;i=x[i].n)
            if(!x[i].vis)
            {
                x[i].vis=x[i^1].vis=1;
                if(x[i].re) printf("%d %d
    ",u,x[i].v);
                dfs(x[i].v);
            }
    }
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            int n,m,ct=0,ans=0;s=1;
            scanf("%d%d",&n,&m);
            memset(x,0,sizeof(x));
            memset(d,0,sizeof(d));
            memset(v,0,sizeof(v));
            for(int i=1;i<=m;++i)
            {
                int u,v;
                scanf("%d%d",&u,&v);
                add(u,v,1),add(v,u,1);
                ++d[u];++d[v];
            }
            for(int i=1;i<=n;++i)
                if(d[i]&1) j[++ct]=i;
                else ++ans;
            printf("%d
    ",ans);
            for(int i=1;i<ct;i+=2)
                add(j[i],j[i+1],0),add(j[i+1],j[i],0);
            for(int i=1;i<=n;++i)
                if(!v[i]) dfs(i);
        }
        return 0;
    }

    723F - st-Spanning Tree

    题目大意:给你一个无向图,让你生成一棵树,这棵树中点s和t的度数分别小于ds,dt,问是否能够生成,如果能,则需要输出它所包含的边

    首先对于那些端点不是s,t的边,并且用并查集(其实也就是类似克鲁斯卡尔中的方法)来避免边过多。

    然后对于已经被连起来的点,我们把它们看成一个点,我们把这些点分成四类1.有边与s连  2.有边与t连  3.有边于s和t连 4.与s,t都没有连边

    当有第四种情况就可以直接判断no了,1直接与s连接并且一定消耗1个s的度数,1直接与t连接并且一定消耗1个t的度数,然后之后再对第3种点分配给s或者t。

    度数一旦不够就判断为no

    最后的问题就是如何把s和t连接起来。如果有第三种点那么就直接借助其中一个点间接连接s和t。

    如果没有第三种点,那么只能用能把s和t直接连接的边进行连接了。

    #include<cstdio>
    #include<cstdlib>
    const int N=200005;
    struct X{
        int u,v;
        bool bj;
    }x[N<<1];
    int fa[N],ans[N],sl,ts,jl[4],sf[N][2];
    int fi(int a){
        int b=a,c;
        while(fa[b]) b=fa[b];
        while(fa[a]){
            c=fa[a];
            fa[a]=b;
            a=c;
        }
        return a;
    }
    int main(){
        int n,m,s[2],d[2];
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;++i) scanf("%d%d",&x[i].u,&x[i].v);
        scanf("%d%d%d%d",&s[0],&s[1],&d[0],&d[1]);
        for(int i=1;i<=m;++i)
            if(x[i].u!=s[0]&&x[i].u!=s[1]&&x[i].v!=s[0]&&x[i].v!=s[1]){
                if(fi(x[i].u)!=fi(x[i].v)){
                    fa[fi(x[i].u)]=fi(x[i].v);
                    ans[++sl]=i;
                }
            }
            else x[i].bj=1;
        for(int i=1;i<=m;++i)
            if(x[i].bj){
                int t=x[i].u-s[0]&&x[i].u-s[1]?x[i].u:x[i].v;
                if(t-s[0]&&t-s[1]) sf[fi(t)][x[i].u+x[i].v==s[1]+t]=i;
                else ts=i;
            }
        for(int i=1;i<=n;++i)
            if(fi(i)==i&&i-s[0]&&i-s[1])
                if(sf[i][0]&&sf[i][1]) ++jl[3];
                else if(sf[i][0]) --d[0],ans[++sl]=sf[i][0];
                else if(sf[i][1]) --d[1],ans[++sl]=sf[i][1];
                else return 0;
        if(d[0]<=0||d[1]<=0||d[0]+d[1]<=jl[3]||(!ts&&!jl[3])){
            printf("No");
            return 0;
        }
        printf("Yes
    ");
        if(!jl[3]) ans[++sl]=ts;
        for(int i=1,pd=0;i<=n;++i)
            if(fi(i)==i&&i-s[0]&&i-s[1]&&sf[i][0]&&sf[i][1]){
                if(d[0]){
                    --d[0];
                    ans[++sl]=sf[i][0];
                    if(!pd) ans[++sl]=sf[i][1],pd=1;
                }
                else ans[++sl]=sf[i][1];
            }
        for(int i=1;i<n;++i) printf("%d %d
    ",x[ans[i]].u,x[ans[i]].v);
        return 0;
    }
  • 相关阅读:
    CPP STL学习笔记
    CPP 设计模式学习
    blackarch 安装指南
    通过 Http 请求获取 GitHub 文件内容
    实践
    升级
    部署-MySql 之Linux篇
    数据库
    RxJs
    Vue
  • 原文地址:https://www.cnblogs.com/bzmd/p/9764934.html
Copyright © 2020-2023  润新知