結果
問題 | No.901 K-ary εxtrεεmε |
ユーザー | SSRS |
提出日時 | 2022-08-28 10:10:16 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 4,001 bytes |
コンパイル時間 | 2,438 ms |
コンパイル使用メモリ | 188,248 KB |
実行使用メモリ | 23,680 KB |
最終ジャッジ日時 | 2024-10-15 09:03:21 |
合計ジャッジ時間 | 22,745 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | WA | - |
testcase_01 | AC | 2 ms
5,248 KB |
testcase_02 | WA | - |
testcase_03 | WA | - |
testcase_04 | WA | - |
testcase_05 | WA | - |
testcase_06 | WA | - |
testcase_07 | WA | - |
testcase_08 | WA | - |
testcase_09 | WA | - |
testcase_10 | WA | - |
testcase_11 | WA | - |
testcase_12 | WA | - |
testcase_13 | WA | - |
testcase_14 | WA | - |
testcase_15 | WA | - |
testcase_16 | WA | - |
testcase_17 | WA | - |
testcase_18 | WA | - |
testcase_19 | WA | - |
testcase_20 | WA | - |
testcase_21 | WA | - |
testcase_22 | WA | - |
testcase_23 | WA | - |
testcase_24 | WA | - |
testcase_25 | AC | 875 ms
21,536 KB |
testcase_26 | WA | - |
testcase_27 | AC | 315 ms
21,504 KB |
testcase_28 | AC | 310 ms
21,552 KB |
testcase_29 | AC | 315 ms
21,504 KB |
ソースコード
#include <bits/stdc++.h> using namespace std; const int INF = 10000000; struct monoid{ int mn; long long sum; monoid(): mn(INF), sum(0){ } }; monoid op(monoid A, monoid B){ monoid ans; ans.mn = min(A.mn, B.mn); if (ans.mn == A.mn){ ans.sum += A.sum; } if (ans.mn == B.mn){ ans.sum += B.sum; } return ans; } struct lazy_segment_tree{ int N; vector<int> lazy; vector<monoid> ST; lazy_segment_tree(){ } lazy_segment_tree(vector<int> w){ int N2 = w.size(); N = 1; while (N < N2){ N *= 2; } ST = vector<monoid>(N * 2 - 1); for (int i = 0; i < N2; i++){ ST[N - 1 + i].mn = 0; ST[N - 1 + i].sum = w[i]; } for (int i = N - 2; i >= 0; i--){ ST[i] = op(ST[i * 2 + 1], ST[i * 2 + 2]); } lazy = vector<int>(N * 2 - 1, 0); } void push(int i){ if (i < N - 1){ lazy[i * 2 + 1] += lazy[i]; lazy[i * 2 + 2] += lazy[i]; } ST[i].mn += lazy[i]; lazy[i] = 0; } void range_add(int L, int R, int x, int i, int l, int r){ push(i); if (r <= L || R <= l){ return; } else if (L <= l && r <= R){ lazy[i] += x; push(i); } else { int m = (l + r) / 2; range_add(L, R, x, i * 2 + 1, l, m); range_add(L, R, x, i * 2 + 2, m, r); ST[i] = op(ST[i * 2 + 1], ST[i * 2 + 2]); } } void range_add(int L, int R, int x){ range_add(L, R, x, 0, 0, N); } monoid all(){ push(0); return ST[0]; } }; struct heavy_light_decomposition{ vector<int> p, sz, in, next; lazy_segment_tree ST; heavy_light_decomposition(vector<int> &p, vector<vector<int>> &c, vector<int> &w): p(p){ int N = p.size(); sz = vector<int>(N); dfs1(c); in = vector<int>(N); next = vector<int>(N, 0); int t = 0; dfs2(c, t); vector<int> w2(N, 0); for (int i = 0; i < N; i++){ w2[in[i]] = w[i]; } ST = lazy_segment_tree(w2); } void dfs1(vector<vector<int>> &c, int v = 0){ sz[v] = 1; for (int &w : c[v]){ dfs1(c, w); sz[v] += sz[w]; if (sz[w] > sz[c[v][0]]){ swap(w, c[v][0]); } } } void dfs2(vector<vector<int>> &c, int &t, int v = 0){ in[v] = t; t++; for (int w : c[v]){ if (w == c[v][0]){ next[w] = next[v]; } else { next[w] = w; } dfs2(c, t, w); } } int lca(int u, int v){ while (true){ if (in[u] > in[v]){ swap(u, v); } if (next[u] == next[v]){ return u; } v = p[next[u]]; } } void path_add(int u, int v, int x){ int w = lca(u, v); while (next[u] != next[w]){ ST.range_add(in[next[u]], in[u] + 1, x); u = p[next[u]]; } ST.range_add(in[w] + 1, in[u] + 1, x); while (next[v] != next[w]){ ST.range_add(in[next[v]], in[v] + 1, x); v = p[next[v]]; } ST.range_add(in[w] + 1, in[v] + 1, x); } monoid get(){ return ST.all(); } }; int main(){ int N; cin >> N; vector<vector<pair<int, int>>> E(N); for (int i = 0; i < N - 1; i++){ int u, v, w; cin >> u >> v >> w; E[u].push_back(make_pair(w, v)); E[v].push_back(make_pair(w, u)); } vector<int> p(N, -1); vector<vector<int>> c(N); vector<int> pw(N); queue<int> q; q.push(0); while (!q.empty()){ int v = q.front(); q.pop(); for (pair<int, int> e : E[v]){ int w = e.second; if (w != p[v]){ p[w] = v; c[v].push_back(w); pw[w] = e.first; q.push(w); } } } long long sum = 0; for (int i = 1; i < N; i++){ sum += pw[i]; } heavy_light_decomposition HLD(p, c, pw); int Q; cin >> Q; for (int i = 0; i < Q; i++){ int k; cin >> k; vector<int> x(k); for (int j = 0; j < k; j++){ cin >> x[j]; } for (int j = 1; j < k; j++){ HLD.path_add(x[0], x[j], 1); } cout << sum - HLD.get().sum << endl; for (int j = 1; j < k; j++){ HLD.path_add(x[0], x[j], -1); } } }