Submission #1289009

#TimeUsernameProblemLanguageResultExecution timeMemory
1289009mychecksedadPaths (RMI21_paths)C++20
8 / 100
68 ms14740 KiB
/* Author : Mychecksdead */ #include<bits/stdc++.h> using namespace std; #define ll long long int #define MOD (1000000000+7) #define MOD1 (998244353) #define pb push_back #define all(x) x.begin(), x.end() #define en cout << '\n' #define ff first #define ss second #define pii pair<int,int> #define vi vector<int> const int N = 1e6+100, M = 1e5+10, K = 52, MX = 30; int n, k, leaf = 0, leaf_id[N], down[N], up[N]; ll num[N], downdist[N], updist[N], sum = 0; vector<pair<int, ll>> g[N]; multiset<ll> IN, OUT; void pre(int v, int p){ leaf_id[v] = 0; if(g[v].size()==1){ leaf_id[v] = ++leaf; } for(auto [u, w]: g[v]) if(u != p) pre(u, v); } void dfs(int v, int p){ down[v] = v; downdist[v] = 0; for(auto [u, w]: g[v]){ if(u != p){ dfs(u, v); if(downdist[u] + w > downdist[v]){ downdist[v] = downdist[u] + w; down[v] = down[u]; } } } // cerr << v << ' ' << down[v] << '\n'; for(auto [u, w]: g[v]){ if(u != p){ if(down[v] != down[u]){ num[leaf_id[down[u]]] = downdist[u] + w; } } } } void reroot1(int v, int p){ vector<array<ll, 3>> UP; for(auto [u, w]: g[v]) if(u != p) UP.pb({downdist[u] + w, down[u], u}); UP.pb({updist[v], up[v], v}); sort(all(UP), greater<array<ll,3>>()); for(auto [u, w]: g[v]){ if(u != p){ if(UP[0][2] != u){ up[u] = UP[0][1]; updist[u] = UP[0][0] + w; }else{ up[u] = UP[1][1]; updist[u] = UP[1][0] + w; } reroot1(u, v); } } // cerr << v << ' ' << up[v] << '\n'; } ll ANS[N]; void change(ll &val, ll dif){ if((*IN.begin()) <= val){ IN.erase(IN.find(val)); sum -= val; }else{ OUT.erase(OUT.find(val)); } val += dif; // do we insert to IN or OUT? ll ins = val; if(OUT.size()){ ll mx = (*prev(OUT.end())); if(mx > val){ OUT.erase(prev(OUT.end())); OUT.insert(val); ins = mx; } } if(IN.size()==k){ IN.insert(ins); sum += ins; if(IN.size() > k){ ll er = *IN.begin(); sum -= er; IN.erase(IN.begin()); OUT.insert(er); } }else{ IN.insert(ins); sum += ins; } } void reroot_calc(int v, int p){ ANS[v] = sum; for(auto [u, w]: g[v]){ if(u==p) continue; // update down_u // update up_u change(num[leaf_id[down[u]]], -w); change(num[leaf_id[up[u]]], w); reroot_calc(u, v); change(num[leaf_id[down[u]]], w); change(num[leaf_id[up[u]]], -w); } } void solve(){ cin >> n >> k; if(n==1){ cout << 0; return; } for(int i = 0; i < n-1; ++i){ int u, v, w; cin >> u >> v >> w; g[u].pb({v, w}); g[v].pb({u, w}); } pre(1, 1); for(int j = 1; j <= leaf; ++j) num[j] = 0; dfs(1, 1); // arbitary root num[leaf_id[down[1]]] = downdist[1]; updist[1] = 0; up[1] = 1; reroot1(1, 1); vector<ll> NUM; for(int j = 1; j <= leaf; ++j) NUM.pb(num[j]); sort(all(NUM), greater<ll>()); for(int i = 1; i <= min(leaf, k); ++i) IN.insert(NUM[i-1]), sum += NUM[i-1]; for(int i = k + 1; i <= leaf; ++i) OUT.insert(NUM[i-1]); reroot_calc(1, 1); // for(int i= 1; i <= n; ++i) cout << up[i] << ' ' << '\n'; for(int i = 1; i <= n; ++i) cout << ANS[i] << '\n'; } int main(){ cin.tie(0); ios::sync_with_stdio(0); int tt = 1, aa; // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); while(tt--){ solve(); } cerr<<"time taken : "<<(float)clock()/CLOCKS_PER_SEC<<" seconds\n"; 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...