Codeforces Round #612 (Div. 2) B. Numbers on Tree

题意:

给你一棵树, 还原树上每个节点的价值, 首先树上的每个节点都有一个数,代表这个节点子树中有多少个节点的价值小于当前节点。

思路:

对于每一个节点,我们维护一个数组,然后数组中的值就是当前节点和当前节点子树的编号, 然后数组中的下标就代表每个节点的价值。
dfs 回溯之后,我们就可以知道当前节点插入到数组的哪一个位置。
对于怎么维护一个数组, 我们就可以用 vector 。vector 支持插入操作。

反思:

做这个题的时候, 完全没有想到要维护一个数组。
所以就无从下手。

#include<bits/stdc++.h>
using namespace std;
#define pb push_back 
const int N = 3000;
int n,m,p,val[N],rt,ans[N];
vector<int>f[N];
vector<int> dfs(int x){
	vector<int>res;
	for (auto it: f[x]){
		vector<int>now = dfs(it);
		res.insert(res.end(), now.begin(), now.end());
	}
	if (val[x] > res.size()){
		puts("NO");
		exit(0);
	}
	res.insert(res.begin() + val[x], x);
	return res;
}
int main(){
	scanf("%d",&n);
	for (int i = 1; i <= n; ++i){
		scanf("%d%d",&p,&val[i]);
		if (p == 0) rt = i;
		f[p].pb(i);
	}
	vector<int> v = dfs(rt);
	for (int i = 0; i < n; ++i)
		ans[v[i]] = i + 1;
	printf("YES\n");		
	for (int i = 1; i <= n; ++i)
		printf("%d ",ans[i]);
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值