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"
using namespace std;
typedef vector<int> vi;
typedef long long ll;
#define int ll
typedef pair<int, int> pii;
#define pb push_back
#define f first
#define s second
#define sz(x) (int) x.size()
#define rep(i,a,b) for(int i=a; i<=b; i++)
const int N=600001;
int n;
vector<pii> adj[N];
multiset<int> s[N];
pair<ll, ll> mb[N]; //mx+b
int par[N];
int find(int x){ return (par[x]==x?x:par[x]=find(par[x])); }
void merge(int x, int y){
int a=find(x), b=find(y);
if(sz(s[a])<sz(s[b])) swap(a,b);
for(int x:s[b]){
s[a].insert(x);
}
mb[a].f+=mb[b].f;
mb[a].s+=mb[b].s;
par[b]=a;
}
void dfs(int x, int c){
if(!sz(adj[x])){
mb[x]={1, -c};
s[x]={c, c};
return;
}
for(auto e:adj[x]){
dfs(e.f, e.s);
merge(e.f, x);
}
x=find(x);
while(mb[x].f>1){
int x2=*prev(s[x].end());
// int x1=*prev(prev(s[x].end()));
mb[x]={mb[x].f-1, mb[x].s+(ll)x2};
s[x].erase(--s[x].end());
}
int x2=*prev(s[x].end());
int x1=*prev(prev(s[x].end()));
s[x].erase(s[x].find(x1)); s[x].erase(s[x].find(x2));
s[x].insert(x2+c); s[x].insert(x1+c);
mb[x].s-=ll(c)*mb[x].f;
}
signed main(){
cin.tie(0)->sync_with_stdio(0);
int a,b; cin >> a >> b;
n=a+b;
rep(i,1,n) par[i]=i;
rep(i,2,n){
int par, c; cin >> par >> c;
adj[par].pb({i, c});
}
dfs(1, 0);
int y=find(1);
int x=*prev(s[y].end());
cout << mb[y].f*x+mb[y].s;
}
# | 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... |