zoukankan      html  css  js  c++  java
  • Codeforces Round #386 (Div. 2) C D E G

    一场比较简单的题 比较脑洞

    C 如果坐车比较快的话 先走不如等车 所以最后的ans是min(纯走路,纯坐车) 讨论一下坐车时间

    D 因为k一定是>=1的 所以当a=b的时候 GBGBGB这样间隔放一定可以 想到a>b和b>a都是不太和谐的 应该尽力趋向于a=b 所以一开始使a>b 然后采取放x*a + 1*b的方式 蛮忙放下去 直到a=b 

    E 可以想到 多出来的数一定要被换掉 所以不需要计入一开始的奇数和偶数总量 先处理出来可以被换的m个数 因为m可能很大 所以取一个min(500050,m) 5*10^5是一定够用的

    所以一开始多出来的数 要向促进奇偶平衡的方向去换 如果违逆了这种平衡(当奇数大于偶数的时候 把多余的数去换奇数) 未来可能会出现多换几次的可能 因为除去这些多余的数 有效的奇数和偶数的个数都已经确定 如果无效数的交换不能使平衡出现 就要继续换原本有效的数字来平衡 所以无效数的交换必须致力于平衡

    如果无效数字没有可以换的数字(奇数>偶数的时候没有偶数来换了) 这时候其实是一定-1的 

    处理完无效数字 处理有效数字的时候也要这样来换 如果也出现了没有数字可以换的情况 就是-1

    G 把这棵树以1为根转化为有根树 每一层的个数就是a[i] 并且最终有t层 有k个孤独城市 即有k个叶子节点

    我们先在每一层拿一个点 连出一条主链来 接下来我们可以算出 在这个图中 叶子节点最多和最少有多少个

    最多 即 现在没有连到树中的点的个数之和 还有当前在主链底端的点

    最少 即 没有办法分配给一个下一层的儿子节点的点的个数 如果要尽量分配的话 仍然会有a[i]-a[i+1]个点不会被分到下一个点 而它只能连a[i-1]的点 所以孤独

    如果k处于最多最少之间 问题有解 

    可以看到 如果要达到maxx 所有的点都连到上一层的主链上去即可 如果一个点不想做叶子节点 需要把 位于这个点正下方的点 使其不连主链 而是直接接上面的点

    能满足条件的点 一共有maxx-minn个 而我们只需要选择maxx-k个进行这种操作就可以了 其余的点连接主链

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<math.h>
    #include<map>
    #include<vector>
    #include<iostream>
    #include<iomanip>
    #include<algorithm>
    #include<queue>
    using namespace std;
    #define L long long
    int n , t , m ;
    int a[200050] ;
    vector<int >r[200050] ;
    vector<int >q[200050] ;
    int main(){
        scanf("%d%d%d",&n,&t,&m) ;
        for(int i=1;i<=t;i++)scanf("%d",&a[i]);
        int tot=1;
        r[0].push_back(1);
        for(int i=1;i<=t;i++){
            for(int j=0;j<a[i];j++){
                tot++;
                r[i].push_back(tot);
            }
        }
        q[1].push_back(2);
        for(int i=1;i<t;i++){
            q[r[i][0]].push_back(r[i+1][0]);
        }
        int minn=1;
        int maxx=1;
        a[t+1]=1;
        for(int i=1;i<=t;i++){
            maxx+=(a[i]-1);
            minn+=(max(a[i]-a[i+1],0));
        }
        if(m<minn||m>maxx){
            printf("-1
    ");
            return 0;
        }
        m=maxx-m;
        for(int i=1;i<=t;i++){
            for(int j=1;j<r[i].size();j++){
                int k=j+1;
                if(k>a[i-1]){
                    q[r[i-1][0]].push_back(r[i][j]);
                }
                else {
                    if(m>0){
                        m--;
                        q[r[i-1][j]].push_back(r[i][j]);
                    }
                    else {
                        q[r[i-1][0]].push_back(r[i][j]);
                    }
                }
            }
        }
        printf("%d
    ",n);
        for(int i=1;i<=n;i++){
            for(int j=0;j<q[i].size();j++){
                printf("%d %d
    ",i,q[i][j]);
            }
        }
    }
    

    一场没有算法的比赛...

  • 相关阅读:
    BZOJ 1718: [Usaco2006 Jan] Redundant Paths 分离的路径( tarjan )
    BZOJ 1040: [ZJOI2008]骑士( 树形dp )
    BZOJ 1691: [Usaco2007 Dec]挑剔的美食家( 平衡树 )
    HDU 5667 Sequence 矩阵快速幂
    FZU 2225 小茗的魔法阵 扫描线+树状数组
    UVA 11916 Emoogle Grid 离散对数 大步小步算法
    UVA 11754 Code Feat 中国剩余定理+暴力
    FZU 2092 收集水晶 dp+bfs
    FZU2090 旅行社的烦恼 巧妙floyd 最短路
    UVA 11426 GCD
  • 原文地址:https://www.cnblogs.com/rayrayrainrain/p/6298174.html
Copyright © 2011-2022 走看看