CodeForces 1214-E Petya and Construction Set 树上构造
题目大意:你需要构造出一个节点数为2n的一棵树. 给出n个正整数 di。
你构造出来的树需要满足:第 2i−1个点与第 2i个点在树上的距离恰为di。这里定义两个点 之间的距离为u到v路径上的边数.如果有多种方案,输出任意一种即可。
又是构造题,可以发现奇数点之间没有关系,偶数点之间也没有关系,
单独把偶数/奇数点拿出来先构造出一条链(按照距离最大的在链头,这样才可以把距离等于链长的放在链尾),
然后在链上找满足题意的分叉点,如果两点距离等于当前链长就把点加到链最后并增长链。
对于树上构造最常见的限制条件就是先构造一条长链,然后在构造链上的分叉
写的时候拿偶数做链写的,图就将就下吧。。)
int n; struct IN { int v,id; }p[MAXN]; int cmp(IN a,IN b) { return a.v>b.v; } int main() { rd(n); for(int i=1;i<=n;++i) rd(p[i].v),p[i].id=i*2; sort(p+1,p+n+1,cmp); for(int i=2;i<=n;++i)//安排偶数 printf("%d %d\n",p[i-1].id,p[i].id); int len=n;//链长 for(int i=1;i<=n;++i) //安排奇数 { int tmp=p[i+p[i].v-1].id; if(tmp==p[len].id)//加到链尾上 p[++len].id=p[i].id-1;//记得把链加长 printf("%d %d\n",p[i].id-1,tmp); } //stop; return 0; }