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