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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章