P5773 [JSOI2016] 轻重路径 题解
Description
在二叉树上,不断删除叶子,你要维护其重链剖分后重儿子编号和。如果两个孩子大小相同,在一开始连向左儿子,后面保持修改前的连接。
Solution
考虑把一个叶子
首先改变的点
那么不妨设当前从上到下修改到
由于有
时间复杂度:
Code
#include <bits/stdc++.h> // #define int int64_t const int kMaxN = 2e5 + 5; int n, m, lg; int64_t sum; int a[kMaxN], p[kMaxN][19], dfn[kMaxN], sz[kMaxN], wson[kMaxN]; int L[kMaxN], R[kMaxN]; std::vector<int> G[kMaxN]; struct BIT { int c[kMaxN]; void upd(int x, int v) { for (; x <= n; x += x & -x) c[x] += v; } int qry(int x) { int ret = 0; for (; x; x -= x & -x) ret += c[x]; return ret; } int qry(int l, int r) { return l <= r ? qry(r) - qry(l - 1) : 0; } } bit; int getsz(int x) { if (!x) return 0; else return bit.qry(dfn[x], dfn[x] + sz[x] - 1); } void dfs(int u, int fa) { static int cnt = 0; dfn[u] = ++cnt, sz[u] = 1, p[u][0] = fa; for (int i = 1; i <= lg; ++i) p[u][i] = p[p[u][i - 1]][i - 1]; for (auto v : G[u]) { if (v == fa) continue; dfs(v, u); sz[u] += sz[v]; if (sz[v] > sz[wson[u]]) wson[u] = v; } sum += wson[u]; } void update(int x) { bit.upd(dfn[x], -1); int rt = 1; for (; rt != x;) { int y = x, now = getsz(rt); for (int i = lg; ~i; --i) if (p[y][i] && getsz(p[y][i]) <= getsz(rt) / 2) y = p[y][i]; int fa = p[y][0]; if (y == wson[fa]) { int z = L[fa] + R[fa] - y; if (getsz(z) > getsz(y)) sum -= y, wson[fa] = z, sum += z; } rt = y; } if (x == wson[p[x][0]]) sum -= x; } void dickdreamer() { std::cin >> n; lg = std::__lg(n); for (int i = 1; i <= n; ++i) { std::cin >> L[i] >> R[i]; if (L[i]) G[i].emplace_back(L[i]); if (R[i]) G[i].emplace_back(R[i]); } dfs(1, 0); std::cin >> m; for (int i = 1; i <= n; ++i) bit.upd(i, 1); std::cout << sum << '\n'; for (int i = 1; i <= m; ++i) { int x; std::cin >> x; update(x); std::cout << sum << '\n'; } } int32_t main() { #ifdef ORZXKR freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); #endif std::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0); int T = 1; // std::cin >> T; while (T--) dickdreamer(); // std::cerr << 1.0 * clock() / CLOCKS_PER_SEC << "s\n"; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步