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