cf1214E

题意简述:构造一棵包含2*n个节点的树,要求2*i 和 2*i-1之间的距离等于d[i]<=n 1<=i<=n

给出N和d数组,输入对应的边

 

题解:对d数组按照从大到小排序,然后首先构造出一条链,1 - 3 - 5 -7 --- 2*n-1

然后一次将 2 ,4  。。 。 加进去,加进去的过程中维护最长的链

int d[maxn];

bool cmp(pair<int,int> x,pair<int,int> y){
	return x.fi>y.fi;
}
int main(){
	int n;
	cin>>n;
	vector<pair<int,int>> vv(n+1,{0,0});
	for(int i=1;i<=n;i++){
		cin>>vv[i].fi;
		vv[i].se=i;
	}	
	sort(vv.begin()+1,vv.end(),cmp);
	for(int i=1;i<=n;i++){
		d[i]=vv[i].se*2-1;
		if(i!=1) cout<<d[i-1]<<' '<<d[i]<<endl;
	}
	int tot=n;
	for(int i=1;i<=n;i++){
		int y=vv[i].se*2;
		int x=i+vv[i].fi-1;
		if(x==tot) tot++,d[tot]=y;
		cout<<d[x]<<' '<<y<<endl;
	}
}

  

posted on 2020-02-19 20:35  欣崽  阅读(139)  评论(0编辑  收藏  举报

导航