1214E Petya and Construction Set

传送门: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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章