Submission #529241

#TimeUsernameProblemLanguageResultExecution timeMemory
529241AdamGSElection Campaign (JOI15_election_campaign)C++17
100 / 100
192 ms25604 KiB
#include<bits/stdc++.h> using namespace std; typedef long long ll; #define rep(a, b) for(int a = 0; a < (b); ++a) #define st first #define nd second #define pb push_back #define all(a) a.begin(), a.end() const int LIM=1e5+7; vector<int>V[LIM]; vector<pair<pair<int,int>,ll>>P[LIM]; int ojciec[LIM], pierwszy[LIM], odleglosc[LIM], rozmiar[LIM], numer[LIM], akt; ll tr[4*LIM], dp[LIM], N=1; // w wierzcholku trzymam sum(dp[syn])-dp[x] void DFS(int x, int o) { rozmiar[x]=1; ojciec[x]=o; for(auto i : V[x]) if(i!=o) { odleglosc[i]=odleglosc[x]+1; DFS(i, x); rozmiar[x]+=rozmiar[i]; } rep(i, V[x].size()) if(V[x][0]==o || rozmiar[V[x][i]]>rozmiar[V[x][0]]) swap(V[x][0], V[x][i]); } void DFS2(int x, int o) { numer[x]=akt; ++akt; if(V[x][0]!=o) pierwszy[V[x][0]]=pierwszy[x]; for(auto i : V[x]) if(i!=o) DFS2(i, x); } void upd(int v, ll x) { v+=N; while(v) { tr[v]+=x; v/=2; } } ll cnt(int l, int r) { l+=N; r+=N; ll ans=tr[l]; if(l!=r) ans+=tr[r]; while(l/2!=r/2) { if(l%2==0) ans+=tr[l+1]; if(r%2==1) ans+=tr[r-1]; l/=2; r/=2; } return ans; } int lca(int a, int b) { while(pierwszy[a]!=pierwszy[b]) { if(odleglosc[pierwszy[a]]<odleglosc[pierwszy[b]]) swap(a, b); a=ojciec[pierwszy[a]]; } if(odleglosc[a]>odleglosc[b]) swap(a, b); return a; } ll sciezka(int a, int b) { ll ans=0; while(pierwszy[a]!=pierwszy[b]) { if(odleglosc[pierwszy[a]]<odleglosc[pierwszy[b]]) swap(a, b); ans+=cnt(numer[pierwszy[a]], numer[a]); a=ojciec[pierwszy[a]]; } if(odleglosc[a]>odleglosc[b]) swap(a, b); ans+=cnt(numer[a], numer[b]); return ans; } void DFS3(int x, int o) { for(auto i : V[x]) if(i!=o) { DFS3(i, x); dp[x]+=dp[i]; } ll ma=0; for(auto i : P[x]) ma=max(ma, sciezka(i.st.st, i.st.nd)+i.nd); dp[x]=max(dp[x], ma); upd(numer[x], -dp[x]); if(x) upd(numer[ojciec[x]], dp[x]); } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n; cin >> n; while(N<n) N*=2; rep(i, n-1) { int a, b; cin >> a >> b; --a; --b; V[a].pb(b); V[b].pb(a); } DFS(0, 0); rep(i, n) pierwszy[i]=i; DFS2(0, 0); int m; cin >> m; while(m--) { int a, b, c; cin >> a >> b >> c; --a; --b; P[lca(a, b)].pb({{a, b}, c}); } DFS3(0, 0); cout << dp[0] << '\n'; }

Compilation message (stderr)

election_campaign.cpp: In function 'void DFS(int, int)':
election_campaign.cpp:4:36: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    4 | #define rep(a, b) for(int a = 0; a < (b); ++a)
      |                                    ^
election_campaign.cpp:22:3: note: in expansion of macro 'rep'
   22 |   rep(i, V[x].size()) if(V[x][0]==o || rozmiar[V[x][i]]>rozmiar[V[x][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...