CF1225F Tree Factory 題解
阿新 • • 發佈:2022-05-28
考慮不論怎麼樣,每個子樹裡邊最長的鏈都會接在別的鏈下面,因為如果這條鏈不動,讓別的連結過來一定不優。所以就直接按這個排序然後輸出 dfs
序就行了。具體證明我也不會,就是考場猜了個結論。
點選檢視程式碼
const int N=1e5+13; int n,son[N],maxd[N],dfn[N],dfs_clock,fa[N],dep[N]; std::vector<int> g[N],ans; void dfs(int u){ dfn[++dfs_clock]=u;dep[u]=dep[fa[u]]+1; for(auto v:g[u])if(v!=son[u])dfs(v); if(son[u])dfs(son[u]); } int main(){ read(n); for(int i=2;i<=n;++i){ int x;read(x);++x; fa[i]=x; g[x].pb(i); } for(int i=n;i>=2;--i){ maxd[i]=max(maxd[i],1); if(maxd[fa[i]]<maxd[i]+1) maxd[fa[i]]=maxd[i]+1,son[fa[i]]=i; } dfs(1); for(int i=1;i<=n;++i) print(dfn[i]-1),print(' ');print('\n'); for(int i=2;i<=n;++i){ int tmp=dep[dfn[i-1]]-dep[fa[dfn[i]]]; while(tmp--) ans.pb(dfn[i]-1); } println((int)ans.size()); for(int i=0,l=ans.size();i<l;++i) print(ans[i]),print(' '); return 0; }