제출 #770538

#제출 시각아이디문제언어결과실행 시간메모리
770538MohamedFaresNebiliPaths (RMI21_paths)C++14
36 / 100
1082 ms32428 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]; int ST[400005], lazy[400005]; int D[100005]; int X[100005], Y[100005], C[100005]; int timer, tin[100005], out[100005], id[100005]; vector<int> adj[100005]; void update(int v, int l, int r, int p, int 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, int 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, int 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; } 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); } 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; int 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...