Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
1864 18级蔡越同 【S】T1最大后缀值个数 C++ 通过 100 415 MS 76432 KB 1703 2020-11-16 16:15:14

Tests(10/10):


#include <bits/stdc++.h> using namespace std; int n,val[1000010],fa[1000010],ans[1000010],s[1000010],t=1,cnt,head[1000010]; bool subtask; struct node{ int nxt,to; }a[1000010]; void add(int u,int v){ a[++cnt].to=v; a[cnt].nxt=head[u]; head[u]=cnt; } void find(int x){ for(int i=head[x];i;i=a[i].nxt){ int v=a[i].to; if(v!=fa[x]){ int id=-1,cnt1=t,cnt2=-1; if(val[v]>s[t]){ int l=1,r=t; while(l<r){ int mid=(l+r)/2; if(s[mid]>=val[v]) l=mid+1; else r=mid; } id=l; cnt2=s[id]; s[id]=val[v]; t=id; } else{ id=t+1; cnt2=s[t+1]; s[++t]=val[v]; } find(v); if(cnt2!=-1 && id!=-1) s[id]=cnt2; t=cnt1; } } ans[x]=t; //cout<<x<<" "<<ans[x]<<endl; } int main(){ scanf("%d",&n); fa[1]=1; for(int i=2;i<=n;i++){ scanf("%d",&fa[i]); if(fa[i]!=i-1) subtask=true; add(fa[i],i); } for(int i=1;i<=n;i++){ scanf("%d",&val[i]); } if(!subtask){ for(int i=1;i<=n;i++){ while(t>=1 && val[i]>val[s[t]]){ t--; } ans[i]=ans[s[t]]+1; s[++t]=i; } for(int i=1;i<=n;i++){ printf("%d ",ans[i]); } } else{ s[1]=val[1]; find(1); for(int i=1;i<=n;i++) printf("%d ",ans[i]); } return 0; }


测评信息: