Submission #1296859

#TimeUsernameProblemLanguageResultExecution timeMemory
1296859danglayloi1Election Campaign (JOI15_election_campaign)C++20
100 / 100
118 ms29504 KiB
#include <bits/stdc++.h> #define ii pair<int, int> #define fi first #define se second #define inf 0x3f3f3f3f3f3f3f3f using namespace std; using ll = long long; const ll mod=1e9+7; const int nx=2e5+5; const int LG=18; int n, h[nx], up[nx][LG], m, dp[nx], f[nx], st[nx], en[nx], tim=0, bit[nx]; vector<int> adj[nx]; vector<pair<ii, int>> ve[nx]; void add(int x, int val) { for(; x <= 2*n; x+=x&-x) bit[x]+=val; } int get(int x) { int res=0; for(; x > 0; x-=x&-x) res+=bit[x]; return res; } void dfs(int u) { st[u]=++tim; for(int v:adj[u]) { if(v==up[u][0]) continue; h[v]=h[u]+1; up[v][0]=u; for(int i = 1; i < LG; i++) up[v][i]=up[up[v][i-1]][i-1]; dfs(v); } en[u]=++tim; } int jump(int u, int k) { if(k<0) return u; for(int i = 0; i < LG; i++) if(k>>i&1) u=up[u][i]; return u; } int lca(int u, int v) { if(h[u]<h[v]) swap(u, v); u=jump(u, h[u]-h[v]); if(u==v) return u; for(int i = LG-1; i >= 0; i--) if(up[u][i]!=up[v][i]) u=up[u][i], v=up[v][i]; return up[u][0]; } void go(int u) { f[u]=0; for(int v:adj[u]) { if(v==up[u][0]) continue; go(v); f[u]+=dp[v]; } dp[u]=f[u]; for(auto it:ve[u]) { int l, r; tie(l, r)=it.fi; if(h[l]>h[r]) swap(l, r); int l1=jump(l, h[l]-h[u]-1); int r1=jump(r, h[r]-h[u]-1); if(l==r) dp[u]=max(dp[u], f[u]+it.se); else if(l==u) dp[u]=max(dp[u], f[u]-dp[r1]+it.se+get(st[r])+f[r]); else dp[u]=max(dp[u], f[u]-dp[l1]-dp[r1]+it.se+get(st[l])+get(st[r])+f[l]+f[r]); } for(int v:adj[u]) if(v!=up[u][0]) add(st[v], f[u]-dp[v]), add(en[v], dp[v]-f[u]); } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n; for(int i = 1; i < n; i++) { int u, v; cin>>u>>v; adj[u].emplace_back(v); adj[v].emplace_back(u); } dfs(1); cin>>m; while(m--) { int u, v, c; cin>>u>>v>>c; int p=lca(u, v); ve[p].push_back({{u, v}, c}); } go(1); // for(int i = 1; i <= n; i++) // cout<<dp[i]<<' '; cout<<dp[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...