Submission #157688

#TimeUsernameProblemLanguageResultExecution timeMemory
157688nvmdavaElection Campaign (JOI15_election_campaign)C++17
100 / 100
240 ms32212 KiB
#include <bits/stdc++.h> #define N 100005 using namespace std; #define ll long long #define ff first #define ss second ll bit[N]; ll get(int v){ ll s = 0; while(v){ s += bit[v]; v -= v & -v; } return s; } void update(int x, ll v){ while(x < N){ bit[x] += v; x += x & -x; } } vector<int> adj[N]; int in[N], out[N], p[N][20]; int d[N]; int n; int cnt; void dfs2(int v, int par){ in[v] = ++cnt; d[v] = d[par] + 1; p[v][0] = par; for(int i = 0; p[v][i] != 0; i++){ p[v][i + 1] = p[p[v][i]][i]; } for(int& x : adj[v]){ if(x == par) continue; dfs2(x, v); } out[v] = cnt; } int find(int v, int u){ if(d[v] < d[u]) swap(v, u); for(int i = 0; d[v] - d[u]; i++) if((d[v] - d[u]) & (1 << i)) v = p[v][i]; if(v == u) return v; for(int i = 18; i >= 0; i--){ if(p[v][i] != p[u][i]){ v = p[v][i]; u = p[u][i]; } } return p[v][0]; } vector<pair<pair<int, int>, int> > obj[N]; ll is1[N], is0[N]; void dfs(int v, int p){ ll res = 0; for(int& x : adj[v]){ if(x == p) continue; dfs(x, v); res += is1[x]; } is1[v] = is0[v] = res; for(auto& x : obj[v]) is1[v] = max(is1[v], res + x.ss + get(in[x.ff.ff]) + get(in[x.ff.ss])); update(in[v], res - is1[v]); update(out[v] + 1, is1[v] - res); } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n; for(int v, u, i = 1; i < n; i++){ cin>>v>>u; adj[v].push_back(u); adj[u].push_back(v); } dfs2(1, 0); cin>>n; while(n--){ int a, b, c; cin>>a>>b>>c; obj[find(a, b)].push_back({{a, b}, c}); } dfs(1, 0); cout<<is1[1]; }
#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...