Submission #1167935

#TimeUsernameProblemLanguageResultExecution timeMemory
1167935_rain_Election Campaign (JOI15_election_campaign)C++20
0 / 100
78 ms27096 KiB
#include<bits/stdc++.h> using namespace std; typedef long long LL; const int N=(int)2e5; const int MAXLOG=15; vector<int>ke[N+2]; int sta[N+2]={},fin[N+2]={},time_dfs=0; int par[N+2][MAXLOG+2],h[N+2]; int n,q; struct Tubo{ int x1,y1,x2,y2; int cost; }; vector<Tubo> query[N+2]; class IT{ public: vector<LL>st; #define lef(id) id*2 #define rig(id) id*2+1 void init(int _n){ st.assign(_n*4+2,0); } void upd(int id,int l,int r,int pos,LL val){ if (l>pos||r<pos) return; if (l==r) st[id]=val; else{ int m=(l+r)/2; upd(lef(id),l,m,pos,val); upd(rig(id),m+1,r,pos,val); st[id]=max(st[lef(id)],st[rig(id)]); } } LL Get(int id,int l,int r,int u,int v){ if (l>v||r<u) return 0; if (u<=l&&r<=v) return st[id]; int m=(l+r)/2; return max(Get(lef(id),l,m,u,v),Get(rig(id),m+1,r,u,v)); } }; IT tree; void dfs(int u,int p){ par[u][0]=p; h[u]=h[p]+1; sta[u]=++time_dfs; for(int i=1;i<=MAXLOG;++i){ par[u][i]=par[par[u][i-1]][i-1]; } for(auto&v:ke[u]){ if (v==p) continue; dfs(v,u); } fin[u]=time_dfs; } int LCA(int u,int v){ if (h[u]<=h[v]) swap(u,v); for(int i=MAXLOG;i>=0;--i){ if (h[par[u][i]]>=h[v]){ u=par[u][i]; } } if (u==v) return u; for(int i=MAXLOG;i>=0;--i){ if (par[u][i]!=par[v][i]) { u=par[u][i],v=par[v][i]; } } return par[u][0]; } int Find_vert(int u,int dep){ if (dep<0) return -1; for(int i=0;i<=MAXLOG;++i) { if ((dep>>i)&1) u=par[u][i]; } return u; } const LL INF=(LL)1e16; LL f[N+2]; void calc(int u,int p){ for(auto&v:ke[u]){ if (v==p) continue; calc(v,u); f[u]+=f[v]; } LL tot=f[u]; for(auto&x:query[u]){ LL sum=tot; if (x.x1==x.y1){ sum=sum-f[x.x1]+f[x.x2]+x.cost; f[u]=max(f[u],sum); } else { sum=sum-f[x.x1]-f[x.y1]+f[x.y2]+f[x.x2]+x.cost; f[u]=max(f[u],sum); } } return; } int main(){ ios::sync_with_stdio(false); cin.tie(0) ; cout.tie(0); //freopen("txt.inp","r",stdin); cin>>n; tree.init(n); for(int i=2;i<=n;++i){ int u,v; cin>>u>>v; ke[u].push_back(v); ke[v].push_back(u); } dfs(1,0); cin>>q; for(int i=1;i<=q;++i){ int u,v,c; cin>>u>>v>>c; int lca=LCA(u,v); int u1=Find_vert(u,h[u]-h[lca]-1); int v1=Find_vert(v,h[v]-h[lca]-1); if (u1==-1) u1=v1; else if (v1==-1) v1=u1; int u2=u,v2=v; if (u2==lca) u2=v; else if (v2==lca) v2=u; assert(u1!=-1 && v1!=-1); query[lca].push_back({u1,v1,u2,v2,c}); } calc(1,0); cout<<f[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...