Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
27937 | M0yunAllgor1thm | 【S】T1最大后缀值个数 | C++ | 解答错误 | 0 | 256 MS | 82408 KB | 896 | 2024-03-31 15:34:38 |
#include <bits/stdc++.h> #define LL long long using namespace std; const int MAXN=1e6+5; int N; vector<int>gra[MAXN]; int w[MAXN],ans[MAXN]; int sta[MAXN],tp=0; int k[MAXN],kt=0; int Read() { int x=0; char ch=getchar(); while(!isdigit(ch)) ch=getchar(); while(isdigit(ch)) x=x*10+(ch^48),ch=getchar(); return x; } void dfs(int u) { int cnt=0; int l=1,r=tp,mid,out=0; while(l<=r) { mid=(l+r)>>1; if(sta[mid]<w[u]) out=mid,r=mid-1; else l=mid+1; } if(out==0) out=tp+1; ans[u]=out; int past=sta[out],pastp=tp; for(int i=0;i<gra[u].size();i++) dfs(gra[u][i]); tp=pastp,sta[out]=past; } int main() { scanf("%d",&N); for(int i=2;i<=N;i++) { int f; f=Read(); gra[f].push_back(i); } for(int i=1;i<=N;i++) w[i]=Read(); dfs(1); for(int i=1;i<=N;i++) printf("%d ",ans[i]); puts(""); return 0; }