B. Numbers on Tree(构造详解)
Posted iss-ue
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了B. Numbers on Tree(构造详解)相关的知识,希望对你有一定的参考价值。
(首先,构造千万不要想复杂了,尽量往简单的想)
(我们构造的a[i]应该互不相同最好,因为相同不好选择)
(比其中一个大就比很多个大,不好确定排名)
(color{Red}{既然如此,我就规定最终a[i]取[1,n]})
(这样一来根就被唯一确定是,a[root]=c[root]+1)
(然后dfs遍历下去,每次找到剩余没有用过的数字中第c[i]+1大的数)
(如果某个顶点的所有子节点数加起来都小于c[i],无解)
(某次为顶点找第c[i]+1大的数没找到,无解。)
#include <bits/stdc++.h>
using namespace std;
const int maxn=2009;
int n,c[maxn],root,l,temp[maxn],ans[maxn],flag,Size[maxn];
vector<int>vec[maxn];
int find(int x)
{
int t=0;
for(int i=1;i<=n;i++)
{
if(temp[i]==0) continue;
t++;
if(t==x)
{
temp[i]=0;
return i;
}
}
return -1;
}
void dfs(int now)
{
Size[now]=1;
ans[now]=find(c[now]+1);//找剩下的第c[now]+1大的
if(ans[now]==-1) flag=-1;
for(int i=0;i<vec[now].size();i++)
{
int x=vec[now][i];
dfs(x);
Size[now]+=Size[x];
}
if(Size[now]-1<c[now]) flag=-1;//子树都比他小都到不了
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++) temp[i]=i;
for(int i=1;i<=n;i++)
{
cin>>l>>c[i];
vec[l].push_back(i);
if(l==0) root=i;
}
dfs(root);
if(flag==-1) cout<<"NO";
else
{
cout<<"YES"<<endl;
for(int i=1;i<=n;i++) cout<<ans[i]<<" ";
}
}
以上是关于B. Numbers on Tree(构造详解)的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #604 (Div. 2) B. Beautiful Numbers(双指针)
LeetCode | 0106. Construct Binary Tree from Inorder and Postorder Traversal从中序与后序遍历序列构造二叉树Python(示(代