给你 \(d_i (\le n)\),要求你构造一棵树满足点 \(2i\) 与 \(2i-1\) 距离为 \(d_i\)。
Solution
关键在于这个神奇的 \(d \leq n\)
按照 \(d_i\) 从大到小排序,并且将所有奇数点串成一条链
依次考虑每个偶数点挂在哪里
对于链上第 \(k\) 个点,它的偶数点应该被挂在 \(k+d_i-1\) 个点的下面
如果第 \(k+d_i-1\) 是链上最后一个点,就需要再挂一个点来进行扩充
可以证明被挂的点一定存在
#include <bits/stdc++.h>
using namespace std;
const int N=100005;
pair<int,int> d[N];
int n,cnt,id[N];
signed main() {
cin>>n;
for(int i=1;i<=n;i++) cin>>d[i].first, d[i].first*=-1, d[i].second=i;
sort(d+1,d+n+1);
for(int i=1;i<=n;i++) {
if(i<n) cout<<2*d[i].second-1<<" "<<2*d[i+1].second-1<<endl;
int x=i-d[i].first-1;
if(x<=n) cout<<2*d[x].second-1<<" "<<2*d[i].second<<endl;
else cout<<id[x-n]<<" "<<2*d[i].second<<endl;
if(x-n==cnt) id[++cnt]=2*d[i].second;
}
}