首页 > 其他 > 详细

cf1214E

时间:2020-02-19 21:17:49      阅读:59      评论:0      收藏:0      [点我收藏+]

题意简述:构造一棵包含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;
	}
}

  

cf1214E

原文:https://www.cnblogs.com/033000-/p/12332983.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!