Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
1846 16级赵子潇 【S】T1最大后缀值个数 C++ 解答错误 80 109 MS 60912 KB 1392 2020-11-16 13:52:58

Tests(8/10):


#include <bits/stdc++.h> using namespace std; char buf[1 << 21], *p1 = buf, *p2 = buf; inline char getc(){ return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++; } inline void read(int &x){ x = 0; char s = getc(); while(s < '0' || s > '9') s = getc(); while('0' <= s && s <= '9'){ x = (x << 3) + (x << 1) + (s ^ 48); s = getc(); } } void print(const int &x){ if(x > 9) print(x / 10); putchar(x % 10 + '0'); } const int N = 1000010; int n, fa[N], val[N]; int head[N], cnt, ans[N]; struct node{ int to, next; }e[N << 1]; inline void add(int x, int y){ e[++cnt].to = y; e[cnt].next = head[x]; head[x] = cnt; } int q[N]; void dfs(int now, int pos){ //第一个小于等于的位置 if(!pos || q[pos] >= val[now]){ q[++pos] = val[now]; ans[now] = pos; for(int i = head[now];i;i = e[i].next){ int v = e[i].to; dfs(v, pos); } }else{ int r = upper_bound(q + 1, q + 1 + pos, val[now], greater<int>()) - q; int tmp = q[r]; q[r] = val[now]; ans[now] = r; for(int i = head[now];i;i = e[i].next){ int v = e[i].to; dfs(v, r); } q[r] = tmp; } } int main() { read(n); for(int i = 2;i <= n;i++){ read(fa[i]); add(fa[i], i); } for(int i = 1;i <= n;i++) read(val[i]); dfs(1, 0); for(int i = 1;i <= n;i++) print(ans[i]), putchar(' '); return 0; }


测评信息: