This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
//testing the quadratic
#define ll long long
const ll MAX_VAL = 1e14+10LL;
const int MAXN = 1e5+10;
using namespace std;
int N, K;
int par[MAXN];
ll prof[MAXN], mx[MAXN], ans[MAXN];
vector<pair<int,ll> > adj[MAXN];
bool used[MAXN];
ll edgParent[MAXN];
multiset<ll> pequenos;
multiset<ll> grandes;
ll curAns;
ll dfs(int x){
mx[x] = 0;
for(auto &e: adj[x]){
if(e.first == par[x])
continue;
par[e.first] = x;
prof[e.first] = prof[x] + e.second;
edgParent[e.first] = prof[x];
ll curVal = dfs(e.first)+e.second;
if(curVal > mx[x]){
pequenos.insert(mx[x]);
mx[x] = curVal;
}
else pequenos.insert(curVal);
}
return mx[x];
}
void apaga(ll val){
if(grandes.find(val) != grandes.end()){
curAns -= val;
grandes.erase(grandes.find(val));
ll toInsert =*prev(pequenos.end());
curAns += toInsert;
grandes.insert(toInsert);
pequenos.erase(prev(pequenos.end()));
}
else{
pequenos.erase(pequenos.find(val));
}
}
void insere(ll val){
curAns += val;
grandes.insert(val);
ll toRemove = *grandes.begin();
curAns -= toRemove;
grandes.erase(grandes.begin());
pequenos.insert(toRemove);
}
void dfsReroot(int x, int antigo){
int n = adj[x].size();
vector<ll> pref(n+1, 0);
vector<ll> suf(n+2, 0);
for(int i = 0; i < n; i++){
pref[i+1] = max(pref[i], mx[adj[x][i].first]+adj[x][i].second );
}
for(int i = n-1; i >= 0; i--){
suf[i+1] = max(suf[i+2], mx[adj[x][i].first]+adj[x][i].second);
}
ans[x] = curAns;
for(int i = 0; i < n; i++){
int viz = adj[x][i].first;
ll edgWeight = adj[x][i].second;
if(viz == antigo) continue;
ll novoMaior = max(pref[i], suf[i+2]);
insere(novoMaior+edgWeight);
apaga(novoMaior);
insere(mx[viz]);
apaga(mx[viz]+edgWeight);
mx[x] = novoMaior;
ll savemx = mx[viz];
dfsReroot(viz, x);
mx[viz] = savemx;
insere(novoMaior);
apaga(novoMaior+edgWeight);
insere(mx[viz]+edgWeight);
apaga(mx[viz]);
}
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
cin >> N >> K;
for(int i= 1, a, b, c; i < N; i++){
cin >> a >> b >> c;
adj[a].push_back(make_pair(b,c));
adj[b].push_back(make_pair(a,c));
}
dfs(1);
pequenos.insert(mx[1]);
while(grandes.size() < K){
auto it = prev(pequenos.end());
ll val = *it;
curAns += val;
pequenos.erase(it);
grandes.insert(val);
}
dfsReroot(1,-1);
for(int i = 1; i <= N; i++)
cout << ans[i] << "\n";
}
Compilation message (stderr)
Main.cpp: In function 'int main()':
Main.cpp:125:26: warning: comparison of integer expressions of different signedness: 'std::multiset<long long int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
125 | while(grandes.size() < K){
| ~~~~~~~~~~~~~~~^~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |