题意简述:构造一棵包含2*n个节点的树,要求2*i 和 2*i-1之间的距离等于d[i]<=n 1<=i<=n
给出N和d数组,输入对应的边
题解:对d数组按照从大到小排序,然后首先构造出一条链,1 - 3 - 5 -7 --- 2*n-1
然后一次将 2 ,4 。。 。 加进去,加进去的过程中维护最长的链
int d[maxn]; bool cmp(pair<int,int> x,pair<int,int> y){ return x.fi>y.fi; } int main(){ int n; cin>>n; vector<pair<int,int>> vv(n+1,{0,0}); for(int i=1;i<=n;i++){ cin>>vv[i].fi; vv[i].se=i; } sort(vv.begin()+1,vv.end(),cmp); for(int i=1;i<=n;i++){ d[i]=vv[i].se*2-1; if(i!=1) cout<<d[i-1]<<' '<<d[i]<<endl; } int tot=n; for(int i=1;i<=n;i++){ int y=vv[i].se*2; int x=i+vv[i].fi-1; if(x==tot) tot++,d[tot]=y; cout<<d[x]<<' '<<y<<endl; } }