#include<bits/stdc++.h> #define FIO cin.tie(0); ios::sync_with_stdio(false) #define all(x) (x).begin(), (x).end() #define fi first #define se second #define TEST #define TESTS int t = 1; cin >> t; while (t--)
usingnamespace std; using i64 = longlong; using u32 = unsigned; using u64 = unsignedlonglong; using pii = std::pair<int, int>;
constexprint N = 5e5 + 10; constexprint MOD = 998244353;
u32 s;
inline u32 get(u32 x){ x ^= x << 13; x ^= x >> 17; x ^= x << 5; return s = x; }
vector<int> e[N]; int fa[N][20]; int top[N], len[N], son[N], d[N], dfn[N], up[N], down[N]; int n, q, idx;
voiddfs1(int u, int f){ d[u] = d[f] + 1; fa[u][0] = f; for (int i = 1; i < 20; ++i) fa[u][i] = fa[fa[u][i - 1]][i - 1]; for (int v : e[u]) { if (v == f) continue; dfs1(v, u); if (len[son[u]] < len[v]) son[u] = v; } len[u] = len[son[u]] + 1; }
voiddfs2(int u, int t){ top[u] = t; dfn[u] = ++idx; if (u == t) { for (int i = 0, x = u; i < len[u]; ++i, x = son[x]) down[dfn[u] + i] = x; for (int i = 0, x = u; i < len[u]; ++i, x = fa[x][0]) up[dfn[u] + i] = x; } if (!son[u]) return; dfs2(son[u], t); for (int v : e[u]) { if (top[v]) continue; dfs2(v, v); } }
intquery(int u, int k){ if (!k) return u; int t = __lg(k); if (k == (1 << t)) return fa[u][t]; k -= 1 << t; u = fa[u][t]; k -= d[u] - d[top[u]]; u = top[u]; return k >= 0 ? up[dfn[u] + k] : down[dfn[u] - k]; }
voidsolve(){ cin >> n >> q >> s; int rt; for (int i = 1, x; i <= n; ++i) { cin >> x; if (!x) rt = i; else { e[i].push_back(x); e[x].push_back(i); } } dfs1(rt, 0); dfs2(rt, rt); i64 ans = 0; for (int i = 1, lastAns = 0, x, k; i <= q; ++i) { x = (get(s) ^ lastAns) % n + 1, k = (get(s) ^ lastAns) % d[x]; ans ^= 1LL * i * (lastAns = query(x, k)); } cout << ans << "\n"; }
#include<bits/stdc++.h> #define FIO cin.tie(0); ios::sync_with_stdio(false) #define all(x) (x).begin(), (x).end() #define fi first #define se second #define TEST #define TESTS int t = 1; cin >> t; while (t--)
usingnamespace std; using i64 = longlong; using u32 = unsigned; using u64 = unsignedlonglong; using pii = std::pair<int, int>;
constexprint N = 2e5 + 10; constexprint MOD = 998244353;
voidsolve(){ int n, k; cin >> n >> k; vector<i64> w(n + 1); for (int i = 1; i <= n; ++i) cin >> w[i]; vector<vector<int>> e(n + 1); vector<int> son(n + 1), top(n + 1); for (int i = 0, u, v; i < n - 1; ++i) { cin >> u >> v; e[u].push_back(v); e[v].push_back(u); } auto dfs1 = [&](auto&& dfs1, int u, int f) -> void { for (int v : e[u]) { if (v == f) continue; dfs1(dfs1, v, u); if (w[son[u]] < w[v]) son[u] = v; } w[u] += w[son[u]]; }; auto dfs2 = [&](auto&& dfs2, int u, int t) -> void { top[u] = t; if (!son[u]) return; dfs2(dfs2, son[u], u); for (int v : e[u]) { if (top[v]) continue; dfs2(dfs2, v, v); } }; dfs1(dfs1, 1, 0); dfs2(dfs2, 1, 1); vector<i64> v; v.reserve(n); for (int i = 1; i <= n; ++i) { if (top[i] == i) v.push_back(w[i]); } ranges::sort(v, greater<i64>()); i64 ans = 0; for (int i = 0; i < k && i < v.size(); ++i) ans += v[i]; cout << ans << "\n"; }
#include<bits/stdc++.h> #define FIO cin.tie(0); ios::sync_with_stdio(false) #define all(x) (x).begin(), (x).end() #define fi first #define se second #define TEST #define TESTS int t = 1; cin >> t; while (t--)
#include<bits/stdc++.h> #define FIO cin.tie(0); ios::sync_with_stdio(false) #define all(x) (x).begin(), (x).end() #define fi first #define se second #define TEST #define TESTS int t = 1; cin >> t; while (t--)
usingnamespace std; using i64 = longlong; using u32 = unsigned; using u64 = unsignedlonglong; using pii = std::pair<int, int>;
constexprint N = 2e5 + 10; constexprint MOD = 998244353;
voidsolve(){ int n; cin >> n; vector<vector<int>> e(n + 1); for (int i = 0, u, v; i < n - 1; ++i) { cin >> u >> v; e[u].push_back(v); e[v].push_back(u); } vector<int> len(n + 1), son(n + 1), dfn(n + 1), gid(n + 1); vector<i64> dp1(n + 1), dp2(2 * n + 1); int idx = 0; i64 ans = 0; auto dfs1 = [&](auto&& dfs1, int u, int f) -> void { for (int v : e[u]) { if (v == f) continue; dfs1(dfs1, v, u); if (len[son[u]] < len[v]) son[u] = v; } len[u] = len[son[u]] + 1; }; auto dfs2 = [&](auto&& dfs2, int u, int t) -> void { dfn[u] = ++idx; if (!son[u]) { gid[u] = dfn[t] * 2; return; } dfs2(dfs2, son[u], t); for (int v : e[u]) { if (dfn[v]) continue; dfs2(dfs2, v, v); } gid[u] = gid[son[u]] + 1; }; auto dfs3 = [&](auto&& dfs3, int u, int f) -> void { dp1[dfn[u]] = 1; if (!son[u]) return; dfs3(dfs3, son[u], u); for (int v : e[u]) { if (v == f || v == son[u]) continue; dfs3(dfs3, v, u); for (int i = 0; i <= len[v]; ++i) { if (i < len[u] && i > 0) ans += dp2[gid[u] + i] * dp1[dfn[v] + i - 1]; if (i && i + 1 < len[v]) ans += dp1[dfn[u] + i] * dp2[gid[v] + i + 1]; } for (int i = 0; i <= len[v]; ++i) { if (i + 1 < len[v]) dp2[gid[u] + i] += dp2[gid[v] + i + 1]; if (i) dp2[gid[u] + i] += dp1[dfn[u] + i] * dp1[dfn[v] + i - 1]; if (i) dp1[dfn[u] + i] += dp1[dfn[v] + i - 1]; } } ans += dp2[gid[u]]; }; dfs1(dfs1, 1, 0); dfs2(dfs2, 1, 1); dfs3(dfs3, 1, 0); cout << ans << "\n"; }