Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
27988 22级廖思学 【S】T1最大后缀值个数 C++ 通过 100 370 MS 82284 KB 857 2024-03-31 18:43:28

Tests(10/10):


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


测评信息: