Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
1843 | 18级张钰晨 | 【S】T1最大后缀值个数 | C++ | 运行超时 | 70 | 2044 MS | 39364 KB | 1069 | 2020-11-16 13:29:23 |
#include<bits/stdc++.h> using namespace std; const int maxn=1e6+5; inline int read(){ int x=0,f=1,ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-48;ch=getchar();} return x*f; } char F[200] ; inline void write( int x ) { int tmp = x > 0 ? x : -x ; if(x<0)putchar('-') ; int cnt=0; while(tmp>0){ F[cnt++]=tmp%10+'0'; tmp/=10; } while(cnt>0)putchar(F[--cnt]); putchar(' '); } int n,h[maxn],e_cnt,fa[maxn],p[maxn]; struct node{int num,nxt;}dfn[maxn]; struct edge{int t,nxt;}e[maxn<<1]; void add_edge(int f,int t){ e[++e_cnt]=(edge){t,h[f]}; h[f]=e_cnt; } void dfs(int x){ int tmp=fa[x]; while(p[tmp]<p[x]&&dfn[tmp].num)tmp=dfn[tmp].nxt; dfn[x]=(node){dfn[tmp].num+1,tmp}; for(int i=h[x];i;i=e[i].nxt)dfs(e[i].t); } int main(){ n=read(); for(int i=2;i<=n;i++)fa[i]=read(),add_edge(fa[i],i); for(int i=1;i<=n;i++)p[i]=read(); dfs(1); for(int i=1;i<=n;i++)write(dfn[i].num);putchar('\n'); return 0; }