Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
33665 | 沈仲恩 | 【S】block | C++ | 运行出错 | 0 | 53 MS | 21192 KB | 2482 | 2024-10-18 13:47:21 |
#include <bits/stdc++.h> #define int long long using namespace std; int n, m, a[100005], root, f[18][100005], sz[100005], dep[100005]; bool rd[100005]; vector <int> son[100005]; inline void dfs(int u) { sz[u] = a[u]; for (int v : son[u]) { dep[v] = dep[u] + 1; dfs(v); sz[u] += sz[v]; } } inline void init() { int x = __lg(n); for (int i = 1; i <= x; i++) { for (int j = 1; j <= n; j++) { f[i][j] = f[i - 1][f[i - 1][j]]; } } dep[root] = 1; dfs(root); } inline int lca(int x, int y) { if (dep[x] < dep[y]) swap(x, y); int l = __lg(dep[x]); for (int i = l; i >= 0; i--) { if (dep[f[i][x]] >= dep[y]) x = f[i][x]; } if (x == y) return x; for (int i = l; i >= 0; i--) { if (f[i][x] != f[i][y]) x = f[i][x], y = f[i][y]; } return f[0][x]; } int r[25]; inline bool cmp(int x, int y) { return dep[x] > dep[y]; } vector <int> av; signed main() { scanf("%lld %lld", &n, &m); for (int i = 1; i <= n; i++) scanf("%lld", &a[i]); for (int i = 1; i <= n; i++) { int k; scanf("%lld", &k); while (k--) { int x; scanf("%lld", &x); rd[x] = 1; f[0][x] = i; son[i].push_back(x); } } for (int i = 1; i <= n; i++) { if (!rd[i]) { root = i; break; } } init(); for (int i = 1; i <= m; i++) { int u, v; scanf("%lld %lld", &v, &u); r[i] = u; } sort(r + 1, r + m + 1, cmp); int res = 0; for (int i = 1; i <= m; i++) { bool b = 1; for (int j : av) { if (lca(r[i], j) == r[i]) { b = 0; break; } } if (b) { av.push_back(r[i]); res = max(res, sz[r[i]]); } } for (int i = 1; i <= n; i++) { bool b = 0; for (int j : av) { int ll = lca(i, j); if (ll == i) { b = 1; break; } } if (!b) res = max(res, sz[r[i]]); } printf("%lld", res); return 0; }