Submission #1289228

#TimeUsernameProblemLanguageResultExecution timeMemory
1289228efegPaths (RMI21_paths)C++20
0 / 100
1096 ms20492 KiB
#include <bits/stdc++.h> using namespace std; #pragma GCC optimize("Ofast") #pragma GCC optimize("unroll-loops") #define ll long long #define F first #define S second #define all(v) v.begin(),v.end() #define pb push_back #define eb emplace_back #define endl '\n' typedef vector<int> vi; typedef pair<long long,int> ii; typedef vector<ii> vii; typedef vector<vi> vvi; typedef tuple<int,int,int> iii; struct SegTree{ int n; vii tree; vector<ll> lazy; SegTree(int n) : n(n){ tree.assign(4 * n + 100,{1e18,-1}); lazy.assign(4 * n + 100,0); } ii merge(ii left,ii right){ if (left.F > right.F) return left; return right; } void push(int node,int s,int e){ if (lazy[node] == 0) return; tree[node].F += lazy[node]; if (s != e){ lazy[node*2] += lazy[node]; lazy[node*2+1] += lazy[node]; } lazy[node] = 0; } void build(int node,int s,int e,vi &order){ if (s == e) { tree[node] = {0,order[s]}; return; } int m = (s+e) / 2; build(node*2,s,m,order); build(node*2+1,m+1,e,order); tree[node] = merge(tree[node*2],tree[node*2+1]); } ii query(int node,int s,int e,int l,int r){ push(node,s,e); if (s > e || r < s || e < l) return {-1e18,-1}; if (l <= s && e <= r) return tree[node]; int m = (s + e) / 2; return merge(query(node*2,s,m,l,r),query(node*2+1,m+1,e,l,r)); } void update(int node,int s,int e,int l,int r,int delta){ push(node,s,e); if (s > e || r < s || e < l) return; if (l <= s && e <= r){ lazy[node] += delta; push(node,s,e); return; } int m = (s+e) / 2; update(node*2,s,m,l,r,delta); update(node*2+1,m+1,e,l,r,delta); tree[node] = merge(tree[node*2],tree[node*2+1]); } }; vi tin,tout,order; vii par; vector<vii> adj; int n,k,zaman; void dfs(int node,int p){ order.pb(node); tin[node] = zaman; zaman++; for (auto pi : adj[node]){ int x,w; tie(x,w) = pi; if (x == p) continue; par[x] = {node,w}; dfs(x,node); } tout[node] = zaman-1; } void apply(int node,int p, SegTree &tree){ for (auto pi : adj[node]){ int x,w; tie(x,w) = pi; if (x == p) continue; tree.update(1,0,n-1,tin[x],tout[x],w); apply(x,node,tree); } } int32_t main(){ ios_base::sync_with_stdio(NULL);cin.tie(NULL); cout.tie(NULL); cin >> n >> k; adj.assign(n + 10,vii()); for (int i = 0; i < n-1; i++){ int u,v,w; cin >> u >> v >> w; u--; v--; adj[u].eb(v,w); adj[v].eb(u,w); } par.assign(n + 10,{-1,-1}); tin.assign(n + 10,-1); tout.assign(n + 10,-1); SegTree tree(n + 100); for (int root = 0; root < n; root++){ order.clear(); zaman = 0; dfs(root,-1); tree.build(1,0,n-1,order); apply(root,-1,tree); ll ans = 0; vi vis(n + 10,0); for (int i = 0; i < k; i++) { ii mx = tree.query(1,0,n-1,0,n-1); ans += mx.F; if (mx.F == 0) break; int curr = mx.S; while (curr != root && curr != -1 && !vis[curr]){ vis[curr] = true; ll w = par[curr].S; tree.update(1,0,n-1,tin[curr],tout[curr],-w); curr = par[curr].F; } } cout << ans << endl; } return 0; }
#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...