给你 (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;
}
}