Submission #282485

#TimeUsernameProblemLanguageResultExecution timeMemory
282485AMO5Putovanje (COCI20_putovanje)C++17
110 / 110
136 ms26360 KiB
#include <bits/stdc++.h> using namespace std; #define fi first #define se second #define eb emplace_back #define mt make_tuple #define all(x) (x).begin(), (x).end() #define sz(x) int(x.size()) #define MOD 1000000007 typedef long long ll; typedef pair <int, int> ii; typedef pair <ll, ll> pll; typedef vector<int> vi; typedef vector<ll> vll; typedef long double ld; const ll INF=63; const int mxn=2e5+5; bool DEBUG=0; int n; vector<ii>adj[mxn]; ll c[mxn][2]; int cnt[mxn],cnt2[mxn],par[18][mxn],dep[mxn]; void dfs(int u, int p){ for(ii x:adj[u]){ int v=x.fi; if(v==p)continue; par[0][v]=u; dep[v]=dep[u]+1; dfs(v,u); } } int lca(int u, int v){ if(dep[u]<dep[v])swap(u,v); int dif = dep[u]-dep[v]; for(int i=0; i<18; i++){ if(dif>>i&1)u=par[i][u]; } if(u==v)return u; for(int i=17; i>=0; i--){ if(par[i][u]!=par[i][v]){ u=par[i][u]; v=par[i][v]; } } return par[0][u]; } void dfs2(int u, int p){ for(ii x:adj[u]){ int v=x.fi; int ind=x.se; if(v==p)continue; dfs2(v,u); cnt2[ind]=cnt[v]; cnt[u]+=cnt[v]; } } void solve(int u, int v){ int LCA = lca(u,v); cnt[u]++; cnt[v]++; cnt[LCA]-=2; /* cerr<<u<<" "<<LCA<<": \n"; for(int i=1; i<=n; i++){ cerr<<i<<" "<<cnt[i]<<"\n"; } */ } int main() { ios_base::sync_with_stdio(0); cin.tie(0); //freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); cin>>n; for(int i=0; i<n-1; i++){ int u,v; cin>>u>>v>>c[i][0]>>c[i][1]; adj[u].eb(v,i); adj[v].eb(u,i); } dep[1]=1; dfs(1,0); for(int i=1; i<18; i++){ for(int j=1; j<=n; j++){ if(par[i-1][j]){ par[i][j]=par[i-1][par[i-1][j]]; } } } for(int i=1; i<=n-1; i++)solve(i,i+1); /* int LCA = lca(n,1); cnt[n]--; cnt[1]--; cnt[LCA]+=2; for(int i=1; i<=n; i++){ cerr<<i<<" "<<cnt[i]<<"\n"; } */ dfs2(1,0); /* for(int i=1; i<=n; i++){ cerr<<i<<" "<<cnt[i]<<"\n"; } */ ll ans=0ll; for(int i=0; i<n-1; i++){ if(cnt2[i]){ ll p1=1ll*cnt2[i]*c[i][0]; if(p1<=c[i][1]){ ans+=p1; }else{ ans+=c[i][1]; } } } cout<<ans; } // READ & UNDERSTAND // ll, int overflow, array bounds, memset(0) // special cases (n=1?), n+1 (1-index) // do smth instead of nothing & stay organized // WRITE STUFF DOWN
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...