Codeforces#386

G:给定叶子结点数和每一层的结点数,构造一棵数。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define pb push_back
using namespace std;
const int MAXN=2e5+5;
int a[MAXN],n,t,k,num1,num2,num3;
vector<int>v1,v2;
void fun(vector<int>& a,vector<int>& b)
{
    a.clear();
    for(int i=0;i<b.size();i++)
        a.pb(b[i]);
    b.clear();
}
int main()
{
    scanf("%d%d%d",&n,&t,&k);
    if(k>n-t)return 0*puts("-1");
    for(int i=1;i<=t;i++)
    {
        scanf("%d",&a[i]);
        if(a[i]>a[i-1])num1+=a[i]-a[i-1];
        else num2+=a[i]-1;
        if(num1>k)return 0*puts("-1");
    }
    int flow1=k-num1;
    int flow2=flow1-num2;
    printf("%d\n",n);
    v1.pb(1);
    for(int tot=2,i=1,j;i<=t;i++)
    {
        if(a[i]<=a[i-1])
        {
            for(int j=0;j<a[i];j++)
            {
                if(flow1>0)
                {
                    printf("%d %d\n",v1[0],tot);
                    if(j%v1.size())flow1--;
                }
                else
                    printf("%d %d\n",v1[j%v1.size()],tot);
                v2.pb(tot++);
            }
        }
        else
        {
            for(int j=0;j<a[i];j++)
            {
                if(flow2>0)
                {
                    printf("%d %d\n",v1[0],tot);
                    if(j%v1.size()&&j+v1.size()>=a[i])flow2--;
                }
                else
                    printf("%d %d\n",v1[j%v1.size()],tot);
                v2.pb(tot++);
            }
        }
        fun(v1,v2);
    }
    return 0;
}

 

posted on 2016-12-21 17:08    阅读(82)  评论(0编辑  收藏  举报

导航