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; }