• AtCoder Regular Contest 076


    在湖蓝跟衡水大佬们打的第二场atcoder,不知不觉一星期都过去了。

    任意门

    C - Reconciled?

    题意:n只猫,m只狗排队,猫与猫之间,狗与狗之间是不同的,同种动物不能相邻排,问有多少种方案。

    #include<cstdio>
    #include<algorithm>
    using namespace std;
     
    const int MOD=1e9+7;
    int n,m,mmh=1;
    int main(){
        scanf("%d%d",&n,&m);
        if (n<m) swap(n,m);
        if (n-m>1) return puts("0"),0;
        for (int i=1;i<=n;i++) mmh=1LL*mmh*i%MOD;
        for (int i=1;i<=m;i++) mmh=1LL*mmh*i%MOD;
        if (n==m) mmh=mmh*2%MOD;
        printf("%d
    ",mmh);
    }
    View Code

    D - Built?

    题意:定义平面上两点间距离为x坐标差和y坐标差的较小值,求最小生成树。

    题解:分别按x坐标,y坐标排序后只有相邻的点之间的边是有贡献的。

    #include<cstdio>
    #include<algorithm>
    #define MN 210001
    using namespace std;
     
    const int MOD=1e9+7;
    int n,m,fa[MN],num=0;
    long long mmh=0;
    struct na{int x,y,p;}p[MN];
    struct bi{int x,y,z;}B[MN];
    bool cmpx(na a,na b){return a.x<b.x;}
    bool cmpy(na a,na b){return a.y<b.y;}
    bool cmp(bi a,bi b){return a.z<b.z;}
    int gf(int x){return x==fa[x]?x:fa[x]=gf(fa[x]);}
    int main(){
        scanf("%d",&n);
        for (int i=1;i<=n;i++) scanf("%d%d",&p[i].x,&p[i].y),p[i].p=i,fa[i]=i;
        sort(p+1,p+1+n,cmpx);
        for (int i=2;i<=n;i++) B[++num].x=p[i-1].p,B[num].y=p[i].p,B[num].z=p[i].x-p[i-1].x;
        sort(p+1,p+1+n,cmpy);
        for (int i=2;i<=n;i++) B[++num].x=p[i-1].p,B[num].y=p[i].p,B[num].z=p[i].y-p[i-1].y;
        sort(B+1,B+1+num,cmp);
        for (int i=1;i<=num;i++){
            B[i].x=gf(B[i].x);B[i].y=gf(B[i].y);
            if (B[i].x!=B[i].y) fa[B[i].x]=B[i].y,mmh+=B[i].z;
        }
        printf("%lld
    ",mmh);
    }
    View Code

    E - Connected?

    题意:给矩形内一些点对,问点对之间连边是否可能不出现相交。

    题解:(这貌似是GDKOI2013的题?)只有边界上的点是有用的,然后把边界展开成一条线段,求区间是否有交即可。

    F - Exhausted?

    题意:求最大匹配,限制是左边的每个点 i 不能与右端的$[L_{i}+1,R_{i}-1]$区间内的点匹配。

    题解:把左端的点按$L_{i}$排序,从小到大枚举,如果当前点x可匹配的区间未被匹配完全,那就直接匹配,已经匹配完全就把已被选择的点中$R_{i}$最小的一个点y拿出来,让x顶替y匹配的位置(如果$R_{x}<=R{y}$自然就不用换了)。最后未被选择的点再强行匹配右端部分即可。

    考场上网络流没卡过,就yy了个奇怪的贪心,然后挂掉了。

    #include<queue>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define MN 110000
    using namespace std;
    
    int read_p,read_ca;
    inline int read(){
        read_p=0;read_ca=getchar();
        while(read_ca<'0'||read_ca>'9') read_ca=getchar();
        while(read_ca>='0'&&read_ca<='9') read_p=read_p*10+read_ca-48,read_ca=getchar();
        return read_p;
    }
    struct na{int l,r;}p[MN];
    bool cmpl(na a,na b){return a.l==b.l?a.r>b.r:a.l<b.l;}
    priority_queue<int,vector<int>,greater<int> > q,_q;
    int n,m,mmh;
    int main(){
        mmh=n=read();m=read();
        for (int i=1;i<=n;i++) p[i].l=read(),p[i].r=read();
        sort(p+1,p+1+n,cmpl);
        for (int i=1;i<=n;i++)
        if (p[i].l==q.size()) q.push(p[i].r),_q.push(q.top()),q.pop();else q.push(p[i].r),mmh--;
        for (int i=q.size()+1;i<=m&&!_q.empty();i++) if (_q.top()<=i) _q.pop(),mmh--;
        printf("%d
    ",mmh);
    }
    View Code

    凭借出前三题的手速还是涨了点rating

  • 相关阅读:
    Eclipse快捷键 10个最有用的快捷键
    28000是 the account is lock
    MVN 打包命令
    增加eclipse启动的Tomcat内存的方法
    Ubuntu 12.04 简单实用的快捷键
    linux zip
    oracle 删除已连接用户
    eclipse下svn的分支与合并操作
    spring xml 配置文件向Bean 设置List值
    如何添加或删除ubuntu用户和组
  • 原文地址:https://www.cnblogs.com/Enceladus/p/7078148.html
Copyright © 2020-2023  润新知