Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
34023 沈仲恩 【S】T2 C++ 运行超时 76 1000 MS 12956 KB 2972 2024-11-01 15:58:33

Tests(16/21):


#pragma GCC optimize("Ofast,no-stack-protector") #include <bits/stdc++.h> using namespace std; int l[200005], r[200005], fa[200005], mi[200005], mx[200005], v[200005], ans; bool b[200005]; inline int read() { int x = 0; bool fl = 0; char c = getchar_unlocked(); while (c < '0' || c > '9') { if (c == '-') fl = 1; c = getchar_unlocked(); } while (c >= '0' && c <= '9') { x = x * 10 + c - '0'; c = getchar_unlocked(); } return fl ? -x : x; } inline void dfs(int u) { if (l[u] != 0) { dfs(l[u]); } if (r[u] != 0) dfs(r[u]); mi[u] = v[u]; mx[u] = v[u]; b[u] = 1; if (l[u] != 0) { b[u] = b[u] && b[l[u]] && mx[l[u]] <= v[u]; mi[u] = min(mi[u], mi[l[u]]); mx[u] = max(mx[u], mx[l[u]]); } if (r[u] != 0) { b[u] = b[u] && b[r[u]] && mi[r[u]] >= v[u]; mi[u] = min(mi[u], mi[r[u]]); mx[u] = max(mx[u], mx[r[u]]); } // if (b[u]) // printf("s%lld\n", u); ans += b[u]; } inline void upd(int u, int x) { v[u] = x; mi[u] = v[u]; mx[u] = v[u]; bool lbu = b[u]; b[u] = 1; if (l[u] != 0) { b[u] = b[u] && b[l[u]] && mx[l[u]] <= v[u]; mi[u] = min(mi[u], mi[l[u]]); mx[u] = max(mx[u], mx[l[u]]); } if (r[u] != 0) { b[u] = b[u] && b[r[u]] && mi[r[u]] >= v[u]; mi[u] = min(mi[u], mi[r[u]]); mx[u] = max(mx[u], mx[r[u]]); } // if (b[u] - lbu) // printf("+%lld\n", u); ans += b[u] - lbu; while (fa[u] != 0) { u = fa[u]; mi[u] = v[u]; mx[u] = v[u]; bool lbu = b[u]; b[u] = 1; if (l[u] != 0) { b[u] = b[u] && b[l[u]] && mx[l[u]] <= v[u]; mi[u] = min(mi[u], mi[l[u]]); mx[u] = max(mx[u], mx[l[u]]); } if (r[u] != 0) { b[u] = b[u] && b[r[u]] && mi[r[u]] >= v[u]; mi[u] = min(mi[u], mi[r[u]]); mx[u] = max(mx[u], mx[r[u]]); } // if (b[u] - lbu) // printf("+%lld\n", u); ans += b[u] - lbu; } } int x[15], s; signed main() { //freopen("bst.in", "r", stdin); //freopen("bst.out", "w", stdout); int n = read(), q = read(); for (int i = 1; i <= n; i++) { l[i] = read(), r[i] = read(); fa[l[i]] = i, fa[r[i]] = i; } for (int i = 1; i <= n; i++) v[i] = read(); fa[0] = 0; dfs(1); while (q--) { int k = read(), xx = read(); upd(k, xx); int ra = ans; while (ra) { x[++s] = ra % 10; ra/=10; } while (s) { putchar_unlocked(x[s--] ^ 48); } putchar_unlocked('\n'); } return 0; }


测评信息: