Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
1876 18级王浩宇 【S】T1最大后缀值个数 C++ 通过 100 418 MS 76440 KB 1359 2020-11-16 16:50:34

Tests(10/10):


#include<bits/stdc++.h> 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],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; } int 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; }


测评信息: