結果

問題 No.901 K-ary εxtrεεmε
ユーザー SSRS
提出日時 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
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

#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);
}
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0