• 【codeforces 746G】New Roads


    【题目链接】:http://codeforces.com/problemset/problem/746/G

    【题意】

    给你3个数字n,t,k;
    分别表示一棵树有n个点;
    这棵树的深度t,以及叶子节点的个数k;
    给你树的每层节点个数;
    让你画出这么一棵树;
    输出它的n-1条边;

    【题解】

    先构造出一棵树的主链;
    即t层,每层的第一个节点都连在一起;
    然后,把第二层的节点都和头结点都连在一起;
    这时有t个点,它们已经不可能是叶子节点了,还有tot=n-k-t,需要把这n-k-t都变成不是叶子节点(非叶子节点),那样最后就能剩k个叶子节点了;
    具体来说,把第i层的点和上一层的点连在一起,能让上一层的点变成非叶子节点;即tot–;如果tot变成0了,则让他和上一层的第一个节点连在一起;这样就不会产生新的非叶子节点了;
    最后判断tot会不会为0;
    为0则输出方案就好;
    不为0就输出无解;

    【Number Of WA

    0

    【完整代码】

    #include <bits/stdc++.h>
    using namespace std;
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define LL long long
    #define rep1(i,a,b) for (int i = a;i <= b;i++)
    #define rep2(i,a,b) for (int i = a;i >= b;i--)
    #define mp make_pair
    #define pb push_back
    #define fi first
    #define se second
    #define ms(x,y) memset(x,y,sizeof x)
    #define Open() freopen("F:\rush.txt","r",stdin)
    #define Close() ios::sync_with_stdio(0),cin.tie(0)
    
    typedef pair<int,int> pii;
    typedef pair<LL,LL> pll;
    
    const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
    const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
    const double pi = acos(-1.0);
    const int N = 2e5+100;
    
    int n,t,k,a[N],tot,fa[N];
    vector <int> v[N];
    
    int main()
    {
        //Open();
        Close();//scanf,puts,printf not use
        //init??????
        cin >> n >> t >> k;
        rep1(i,1,t) cin >> a[i];
        a[0] = 1;
        if (a[t]>k)
            return cout <<-1<<endl,0;
        rep1(i,0,t)
            rep1(j,1,a[i])
                v[i].pb(++tot);
        rep1(i,0,a[1]-1)
            fa[v[1][i]] = 1;
        rep1(i,2,t)
            fa[v[i][0]] = v[i-1][0];
        int l = n-t-k;
        rep1(i,2,t)
        {
            rep1(j,1,a[i]-1)
                if (l>0 && j<=a[i-1]-1)
                    fa[v[i][j]] = v[i-1][j],l--;
                else
                    fa[v[i][j]] = v[i-1][0];
        }
        if (l!=0)
            return cout <<-1<<endl,0;
        cout << n <<endl;
        rep1(i,2,n)
            cout <<i<<' '<<fa[i]<<endl;
        return 0;
    }
  • 相关阅读:
    前台线程与后台线程的区别
    触发器
    Asp.net AutopostBack 属性
    Spring实战拆书--SpringBean
    侣行APP
    用android去写一个小程序
    java如何使用JUnit进行单元测试
    JDK的安装与配置以及eclipse的使用
    软件工程第一次作业(1)
    软件工程第一次作业(2)
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7626312.html
Copyright © 2020-2023  润新知