Submission #59217

#TimeUsernameProblemLanguageResultExecution timeMemory
59217gusfringElection Campaign (JOI15_election_campaign)C++14
100 / 100
760 ms96844 KiB
#include <bits/stdc++.h> using namespace std; const int MAX = (1e5)+1; int n, m; vector<int> g[MAX]; vector<tuple<int,int,int> > paths[MAX]; int d[MAX]; vector<int> anc[MAX]; void init_lca(int u, int p) { for(int v: g[u]) if(v != p) { d[v] = d[u] + 1; anc[v].push_back(u); for(int j = 0; 1 << j+1 <= d[v]; j++) anc[v].push_back(anc[anc[v][j]][j]); init_lca(v, u); } } int query_lca(int u, int v) { if(d[u] > d[v]) { int diff = d[u] - d[v]; for(int j = anc[u].size()-1; j >= 0; j--) if(diff >> j & 1) u = anc[u][j]; } else if(d[u] < d[v]) { int diff = d[v] - d[u]; for(int j = anc[v].size()-1; j >= 0; j--) if(diff >> j & 1) v = anc[v][j]; } if(u == v) return u; for(int j = anc[u].size()-1; j >= 0; j--) if(j < anc[u].size() && anc[u][j] != anc[v][j]) { u = anc[u][j]; v = anc[v][j]; } return anc[u][0]; } int dp[MAX], sum[MAX], c[MAX]; map<int, int> mpf[MAX]; void dfs(int u, int p) { for(int v: g[u]) if(v != p) { dfs(v, u); sum[u] += dp[v]; if(mpf[v].size() > mpf[u].size()) { mpf[u].swap(mpf[v]); swap(c[u], c[v]); } for(auto pp: mpf[v]) mpf[u][pp.first] = pp.second + c[v] - c[u]; } dp[u] = sum[u]; for(auto path: paths[u]) { int a, b, w; tie(a, b, w) = path; int down1 = (a != u ? mpf[u][a] + c[u] : 0); int down2 = (b != u ? mpf[u][b] + c[u] : 0); dp[u] = max(sum[u] + down1 + down2 + w, dp[u]); } mpf[u][u] = -c[u]; c[u] += sum[u] - dp[u]; } int main() { ios::sync_with_stdio(false); cin.tie(0); cin >> n; bool ok = true, ok2 = true; for(int i = 1, u, v; i < n; i++) { cin >> u >> v; --u; --v; if(u != v - 1) ok = false; g[u].push_back(v); g[v].push_back(u); } init_lca(0, -1); cin >> m; for(int i = 0, u, v, w; i < m; i++) { cin >> u >> v >> w; --u; --v; if(w != 1) ok2 = false; paths[query_lca(u, v)].emplace_back(u, v, w); } dfs(0, -1); cout << dp[0]; }

Compilation message (stderr)

election_campaign.cpp: In function 'void init_lca(int, int)':
election_campaign.cpp:15:24: warning: suggest parentheses around '+' inside '<<' [-Wparentheses]
   for(int j = 0; 1 << j+1 <= d[v]; j++)
                       ~^~
election_campaign.cpp: In function 'int query_lca(int, int)':
election_campaign.cpp:29:49: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int j = anc[u].size()-1; j >= 0; j--) if(j < anc[u].size() && anc[u][j] != anc[v][j]) {
                                               ~~^~~~~~~~~~~~~~~
election_campaign.cpp: In function 'int main()':
election_campaign.cpp:64:7: warning: variable 'ok' set but not used [-Wunused-but-set-variable]
  bool ok = true, ok2 = true;
       ^~
election_campaign.cpp:64:18: warning: variable 'ok2' set but not used [-Wunused-but-set-variable]
  bool ok = true, ok2 = true;
                  ^~~
#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...