Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
1850 | 18级蔡越同 | 【S】T1最大后缀值个数 | C++ | 解答错误 | 30 | 2066 MS | 10052 KB | 1053 | 2020-11-16 14:36:37 |
#include <bits/stdc++.h> using namespace std; int n,val[1000010],fa[1000010],ans[1000010],s[1000010],t=1; bool subtask; void find(int x,int maxn,int s){ //cout<<x<<" "; if(val[x]>=val[s] && x!=s){ ans[s]=ans[x]+1; return ; } if(x==1) return; find(fa[x],maxn,s); } 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; } 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{ for(int i=1;i<=n;i++){ ans[i]=1; find(fa[i],0,i); } for(int i=1;i<=n;i++){ find(fa[i],0,i); printf("%d ",ans[i]); } } return 0; }