Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
1807 16级赵子潇 【S】T1最大后缀值个数 C++ 运行超时 10 1000 MS 24252 KB 1523 2020-11-16 09:04:52

Tests(1/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 q[N], l; inline void solve1(){ // 链 for(int i = 1;i <= n;i++){ while(l && val[i] >= q[l]) --l; q[++l] = val[i]; print(l); putchar(' '); } } int head[N], cnt; struct node{ int to, next; }e[N]; inline void add(int x, int y){ e[++cnt].to = y; e[cnt].next = head[x]; head[x] = cnt; } int rec[N], ans[N]; inline void calc(int size, int x){ l = 0; for(int i = 1;i <= size;i++){ while(l && rec[i] >= q[l]) --l; q[++l] = rec[i]; } ans[x] = l; } void dfs(int now, int step){ rec[step] = val[now]; calc(step, now); for(int i = head[now];i;i = e[i].next) dfs(e[i].to, step + 1); } inline void solve2(){ // 树 for(int i = 1;i <= n;i++) add(fa[i], i); dfs(1, 1); for(int i = 1;i <= n;i++) print(ans[i]), putchar(' '); } int main() { read(n); bool fg = true; for(int i = 2;i <= n;i++){ read(fa[i]); if(fa[i] != i - 1) fg = false; } for(int i = 1;i <= n;i++) read(val[i]); if(fg) solve1(); else solve2(); return 0; }


测评信息: