Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
1875 | 18级赵嘉熠 | 【S】T1最大后缀值个数 | C++ | 运行出错 | 0 | 0 MS | 80 KB | 1325 | 2020-11-16 16:49:55 |
#include<bits/stdc++.h> using namespace std; #define int long long const int N=1e6+10; int n; int fa[N],val[N],ans[N]; struct edge { int to,next; }e[N<<4]; int head[N],tot; void add(int u,int v) { e[++tot]={v,head[u]}; head[u]=tot; } int st[N],tp; int find(int l,int r,int v){ while(l<=r){ int mid=(l+r)/2; if(st[mid]>=v){ l=mid+1; } else r=mid-1; } return l; } void dfs(int p) { for(int i=head[p];i;i=e[i].next) { int v=e[i].to; if(v!=fa[p]) { int tmp=0,id=0,cnt=tp; if(val[v]>st[tp]){ id=find(1,tp,val[v]); tmp=st[id]; st[id]=val[v]; tp=id; } else{ tmp=st[tp+1]; st[++tp]=val[v]; id=tp; } dfs(v); if(tmp!=0 && id!=0) st[id]=tmp; tp=cnt; } } ans[p]=tp; } signed main() { scanf("%d",&n); for(int i=2;i<=n;i++) { scanf("%d", &fa[i]); add(fa[i],i); } for(int i=1;i<=n;i++) scanf("%d",&val[i]); st[++tp]=val[1]; dfs(1); for(int i=1;i<=n;i++) printf("%d ",ans[i]); return 0; }