傳送門:http://codeforces.com/problemset/problem/1214/E
題意:讓你構造一棵節點爲2n的樹,滿足2i 到 2*i-1的距離爲d[i]且d[i]<=n
思路:首先我們可以看出2 4 6 8 等等邊是沒有任何顯示的 只有奇偶邊纔有現在
應爲最大的d[i]<=n 所以我們可以可以通過給d[i]排序,
建立一條長度爲n的長鏈 全爲偶數構成,添加奇數點,
若當前偶數節點於奇數節點的距離爲n則可以添加到長鏈末端
否則在長鏈中能找到一節點,在這個節點後添加一個分支滿足d[i]
ACcode:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5+10;
int n,b[maxn];
struct node{int d,i;}a[maxn];
bool cmp(node a,node b){return a.d>b.d;}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i].d),a[i].i=i;
sort(a+1,a+n+1,cmp);
for(int i=2;i<=n;i++) printf("%d %d\n",a[i-1].i*2,a[i].i*2);
for(int i=1;i<=n;i++) b[i]=a[i].i*2;
int now=n;
for(int i=1;i<=n;i++)
{
int dis=i+a[i].d;
if(b[dis] == 0) b[dis] = 2*a[i].i-1;
printf("%d %d\n",2*a[i].i-1,b[dis-1]);
}
return 0;
}