标签:math tin i++ 复杂 back span return 简单 tps
\(首先,构造千万不要想复杂了,尽量往简单的想\)
\(我们构造的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]<<" ";
}
}
标签:math tin i++ 复杂 back span return 简单 tps
原文地址:https://www.cnblogs.com/iss-ue/p/12905899.html