結果
問題 | No.901 K-ary εxtrεεmε |
ユーザー |
![]() |
提出日時 | 2022-08-28 10:49:35 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 956 ms / 3,000 ms |
コード長 | 4,001 bytes |
コンパイル時間 | 2,357 ms |
コンパイル使用メモリ | 189,096 KB |
実行使用メモリ | 23,640 KB |
最終ジャッジ日時 | 2024-10-15 09:39:07 |
合計ジャッジ時間 | 23,527 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 29 |
ソースコード
#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[v]];}}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);}}}