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 long long ll;
typedef long double ld;
typedef pair<int, int> pii;
#define fi first
#define se second
#define mp make_pair
#define fastIO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
const int N = (int)2e5 + 10;
const int LOG = 20;
vector<pii> T[N];
int idx[N];
ll cnt[N];
ll c1[N], c2[N];
int par[LOG][N];
int tin[N];
int tout[N];
int tt;
void dfs(int u, int pr){
tin[u] = ++tt;
par[0][u]=pr;
for(int i = 1; i < LOG; i ++ )
par[i][u]=par[i-1][par[i-1][u]];
for(auto x : T[u]){
if(x.fi == pr) continue;
idx[x.fi]=x.se;
dfs(x.fi, u);
}
tout[u] = tt;
}
bool is_anc(int a, int b){
return tin[a] <= tin[b] && tout[a] >= tout[b];
}
int lca(int a, int b){
if(is_anc(a,b))return a;
if(is_anc(b,a))return b;
for(int i = LOG - 1; i >= 0 ; i -- )
if(!is_anc(par[i][a],b))a=par[i][a];
return par[0][a];
}
ll ans = 0;
void dfs2(int u, int pr){
for(auto x : T[u]){
if(x.fi == pr) continue;
dfs2(x.fi, u);
cnt[u] += cnt[x.fi];
}
if(pr == -1) return;
ans += min(cnt[u] * 1ll * c1[idx[u]], c2[idx[u]]);
}
int main(){
fastIO;
int n;
cin >> n;
int u, v;
for(int i = 1; i < n; i ++ ){
cin >> u >> v >> c1[i] >> c2[i];
T[u].push_back(mp(v,i));
T[v].push_back(mp(u,i));
}
dfs(1,1);
for(int i = 1; i < n; i ++ ){
cnt[i]++;
cnt[i+1]++;
cnt[lca(i,i + 1)] -= 2 ;
}
dfs2(1,-1);
cout << ans << "\n";
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |