Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
1877 18级赵嘉熠 【S】T1最大后缀值个数 C++ 运行出错 0 2 MS 84 KB 1392 2020-11-16 16:50:43

Tests(0/10):


#include<bits/stdc++.h> #define int long long using namespace std; 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<<2],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("%lld",&n); for(int i=2;i<=n;i++) { scanf("%lld", &fa[i]); add(fa[i],i); } for(int i=1;i<=n;i++) scanf("%lld",&val[i]); st[++tp]=val[1]; dfs(1); for(int i=1;i<=n;i++) printf("%lld ",ans[i]); return 0; }


测评信息: