Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
27934 | 22fhq | 【S】T1最大后缀值个数 | C++ | 运行出错 | 0 | 3 MS | 88 KB | 2235 | 2024-03-31 15:26:07 |
#include<bits/stdc++.h> using namespace std; #define int long long int n,w[1000006],ans[1000006]; int can[1000006]; vector<int>e[1000006]; struct ds{ int fa[1000006],dp[1000006],son[1000006],sz[1000006],top[1000006],dfn[1000006],rnk[1000006],cnt; void dfs1(int p){ son[p]=-1; sz[p]=1; for(int x:e[p]){ if(x==fa[p])continue; fa[x]=p; dp[x]=dp[p]+1; dfs1(x); sz[p]+=sz[x]; if(son[p]==-1||sz[son[p]]<sz[x])son[p]=x; } return ; } void dfs2(int p,int tp){ top[p]=tp; dfn[p]=++cnt; rnk[cnt]=p; if(son[p]==-1)return; dfs2(son[p],tp); for(int x:e[p]){ if(x==son[p]||x==fa[p])return ; dfs2(x,x); } return; } }T1; struct st{ int st[1000006][30],lg2[1000006]; void init(){ for(int i=1;i<=n;i++){ st[i][0]=w[T1.rnk[i]]; } lg2[1]=0; for(int i=2;i<=1e6+5;i++){ lg2[i]=lg2[i/2]+1; } for(int j=1;j<=20;j++){ for(int i=1;i<=n;i++){ st[i][j]=max(st[i][j-1],st[i+(1<<(j-1))][j-1]); } } } int qu(int l,int r){ return max(st[l][lg2[r-l+1]],st[r-(1<<lg2[r-l+1])+1][lg2[r-l+1]]); } }T2; void dfs(int p){ ans[p]=ans[T1.fa[p]]+can[p]; for(int x:e[p]){ if(x==T1.fa[x])continue; dfs(x); } return ; } int qu(int p){ int res=0; while(p!=0){ res=max(res,T2.qu(T1.dfn[T1.top[p]],T1.top[p])); p=T1.fa[T1.top[p]]; } return res; } signed main(){ freopen("slpjbh.in","r",stdin); freopen("slpjbh.out","w",stdout); ios::sync_with_stdio(0); cin>>n; for(int i=1;i<n;i++){ int fa; cin>>fa; e[fa].push_back(i+1); } for(int i=1;i<=n;i++){ cin>>w[i]; } T1.dfs1(1); T1.dfs2(1,1); T2.init(); for(int i=1;i<=n;i++){ can[i]=(w[i]==qu(i)); cout<<can[i]<<endl; } dfs(1); for(int i=1;i<=n;i++){ cout<<ans[i]<<" "; } return 0; }