题意简述:构造一棵包含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;
}
}
原文:https://www.cnblogs.com/033000-/p/12332983.html