Submission #770542

#TimeUsernameProblemLanguageResultExecution timeMemory
770542vjudge1Paths (RMI21_paths)C++17
48 / 100
1065 ms35104 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; #define int ll int N, K, P[100005], rem[100005]; int par[100005][20]; ll ST[400005], lazy[400005]; ll D[100005]; int X[100005], Y[100005], C[100005]; int timer, tin[100005], out[100005], id[100005]; ll sol[100005]; vector<int> adj[100005]; void update(int v, int l, int r, int p, ll val) { if(l == r) { ST[v] = val; lazy[v] = 0; return; } int md = (l + r) / 2; if(p <= md) update(v * 2, l, (l + r) / 2, p, val); else update(v * 2 + 1, (l + r) / 2 + 1, r, p, val); ST[v] = max(ST[v * 2], ST[v * 2 + 1]); lazy[v] = 0; } void prop(int v, int l, int r) { if(l == r || lazy[v] == 0) return; lazy[v * 2] += lazy[v]; lazy[v * 2 + 1] += lazy[v]; ST[v * 2] -= lazy[v]; ST[v * 2 + 1] -= lazy[v]; lazy[v] = 0; } void update(int v, int l, int r, int lo, int hi, ll val) { prop(v, l, r); if(l > hi || r < lo) return; if(l >= lo && r <= hi) { ST[v] -= val; lazy[v] += val; prop(v, l, r); return; } update(v * 2, l, (l + r) / 2, lo, hi, val); update(v * 2 + 1, (l + r) / 2 + 1, r, lo, hi, val); ST[v] = max(ST[v * 2], ST[v * 2 + 1]); } int query(int v, int l, int r) { prop(v, l, r); if(l == r) return l; if(ST[v * 2] >= ST[v * 2 + 1]) return query(v * 2, l, (l + r) / 2); return query(v * 2 + 1, (l + r) / 2 + 1, r); } void dfs(int v, int p, ll dep = 0) { par[v][0] = p; id[timer] = v; tin[v] = timer++; update(1, 0, N - 1, tin[v], dep); for(auto u : adj[v]) { int nxt = ((X[u] ^ Y[u]) ^ v); if(nxt == p) continue; P[nxt] = u; dfs(nxt, v, dep + C[u]); } out[v] = timer - 1; } void solve(int v, int p) { sol[v] = ST[1]; for(auto u : adj[v]) { int nxt = ((X[u] ^ Y[u]) ^ v); if(nxt == p) continue; update(1, 0, N - 1, 0, N - 1, -C[u]); update(1, 0, N - 1, tin[nxt], out[nxt], 2 * C[u]); solve(nxt, v); update(1, 0, N - 1, 0, N - 1, C[u]); update(1, 0, N - 1, tin[nxt], out[nxt], -2 * C[u]); } } int32_t main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> N >> K; for(int l = 0; l < N - 1; l++) { cin >> X[l] >> Y[l] >> C[l]; int U = X[l], V = Y[l]; adj[U].push_back(l); adj[V].push_back(l); } if(K == 1) { dfs(1, 1); solve(1, 1); for(int l = 1; l <= N; l++) cout << sol[l] << "\n"; return 0; } for(int l = 1; l <= N; l++) { ///memset(ST, 0, sizeof ST); ///memset(lazy, 0, sizeof lazy); for(int i = 1; i <= N; i++) rem[i] = 0; rem[l] = 1; ll res = 0; timer = 0; dfs(l, l); for(int i = 1; i < 20; i++) for(int j = 1; j <= N; j++) par[j][i] = par[par[j][i - 1]][i - 1]; for(int i = 0; i < K; i++) { int A = query(1, 0, N - 1); res += ST[1]; A = id[A]; ///cout << ST[1] << " "; int B = A; for(int j = 19; j >= 0; j--) { if(rem[par[B][j]] == 0) B = par[B][j]; } B = par[B][0]; while(A != B) { update(1, 0, N - 1, tin[A], out[A], C[P[A]]); rem[A] = 1; A = par[A][0]; } } cout << res << "\n"; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...