Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
27988 | 22级廖思学 | 【S】T1最大后缀值个数 | C++ | 通过 | 100 | 370 MS | 82284 KB | 857 | 2024-03-31 18:43:28 |
#include<bits/stdc++.h> using namespace std; #define int long long const int MAXN=1000010; int n,p[MAXN],stk[MAXN],top,ans[MAXN]; struct Edge{int v,nxt;}e[MAXN];int h[MAXN],cnt; void add_side(int u,int v){e[++cnt]={v,h[u]};h[u]=cnt;} int find_place(int x){ int l=1,r=top; while(l<r){ int mid=(l+r)>>1; if(stk[mid]>=x)l=mid+1; else r=mid; } if(stk[l]<x)return l; return top+1; } void dfs(int x){ ans[x]=top; for(int i=h[x],v=e[i].v;i;i=e[i].nxt,v=e[i].v){ int k=find_place(p[v]); int lnt=stk[k],ltop=top; stk[k]=p[v];top=k; dfs(v); stk[k]=lnt;top=ltop; } } signed main(){ scanf("%lld",&n); for(int i=2;i<=n;i++){ int fa;scanf("%lld",&fa); add_side(fa,i); } for(int i=1;i<=n;i++)scanf("%lld",&p[i]); stk[++top]=p[1]; dfs(1); for(int i=1;i<=n;i++){ cout<<ans[i]<<" "; } return 0; }