Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
1811 | 18级李灏冬 | 【S】T1最大后缀值个数 | C++ | 运行超时 | 10 | 1000 MS | 36108 KB | 1927 | 2020-11-16 09:38:17 |
#include<bits/stdc++.h> #define LL long long using namespace std; int n; struct node{ int from; int to; int next; }edge[1000005]; int head[1000005]; int cnt; void add(int u,int v){ edge[++cnt].to=v; edge[cnt].from=u; edge[cnt].next=head[u]; head[u]=cnt; return ; } LL val[1000005]; LL Max[1000005]; int sum; LL getmax(LL a,LL b){ if(a>=b) return a; return b; } int ans; queue<int> q; void dfs(int now){ for(int j=head[now];j;j=edge[j].next){ int u=edge[j].from; int v=edge[j].to; q.push(v); Max[v]=getmax(Max[u],val[v]); dfs(v); } return ; } int main(){ cin>>n; int id; for(int i=2;i<=n;i++){ scanf("%d",&id); add(i,id); if(id==i-1) sum++; } for(int i=1;i<=n;i++){ scanf("%lld",&val[i]); } if(sum==n-1){ for(int i=1;i<=n;i++){ memset(Max,0,sizeof(Max)); ans=0; Max[i]=val[i]; for(int j=i-1;j>=1;j--){ Max[j]=getmax(Max[j+1],val[j]); } for(int j=1;j<=i;j++){ if(val[j]==Max[j]) ans++; else continue; } cout<<ans<<" "; } cout<<endl; return 0; } else{ for(int i=1;i<=n;i++){ memset(Max,0,sizeof(Max)); ans=0; Max[i]=val[i]; q.push(i); dfs(i); while(!q.empty()){ int now=q.front(); q.pop(); if(val[now]==Max[now]) ans++; else continue; } cout<<ans<<" "; } cout<<endl; return 0; } return 0; }