Submission #1168102

#TimeUsernameProblemLanguageResultExecution timeMemory
1168102sitablechairElection Campaign (JOI15_election_campaign)C++20
100 / 100
109 ms33352 KiB
#include <bits/stdc++.h> #define ll long long #define ldb long double #define endl '\n' #define For(i,l,r) for(int i=l;i<=r;i++) #define ForD(i,r,l) for(int i=r;i>=l;i--) #define ff first #define ss second #define pb push_back #define all(x) x.begin(),x.end() #define sz(x) (signed)x.size() #define unq(x) x.resize(unique(all(x))-x.begin()) #define F "TASK" #define fio freopen(F".INP","r",stdin);freopen(F".OUT","w",stdout); using namespace std; const int N=1e5+3; int n,m,siz[N],d[N],par[17][N],tin[N],tout[N],tdfs=0; int cH[N],cId[N],pos[N],curChain=0,curPos=0,chain[N]; ll bit[N],dp[N],dp1[N]; vector<int> g[N]; vector<pair<int,int>> in[N]; vector<pair<pair<int,int>,int>> in1[N]; ll query(int x) { ll ans=0; while(x>0) { ans+=bit[x]; x-=x&(-x); } return ans; } void update(int x,int y) { if (x==0) return; while(x<=n) { bit[x]+=y; x+=x&(-x); } } void predfs(int u,int p=0) { tin[u]=++tdfs; siz[u]=1; for(auto v: g[u]) if (v!=p) { d[v]=d[u]+1; par[0][v]=u; For(i,1,16) par[i][v]=par[i-1][par[i-1][v]]; predfs(v,u); siz[u]+=siz[v]; } tout[u]=tdfs; } void hld(int u,int p=0) { int big=-1,bsz=-1; chain[++curPos]=u; pos[u]=curPos; cId[u]=curChain; if (!cH[cId[u]]) cH[curChain]=u; for(auto v: g[u]) if (v!=p && bsz<siz[v]) big=v,bsz=siz[v]; if (big!=-1) hld(big,u); for(auto v: g[u]) if (v!=p && v!=big) { curChain++; hld(v,u); } } int lca(int u,int v) { if (d[u]<d[v]) swap(u,v); int dd=d[u]-d[v]; For(i,0,17) if (dd>>i&1) u=par[i][u]; if (u==v) return u; ForD(i,16,0) if (par[i][u]!=par[i][v]) u=par[i][u],v=par[i][v]; return par[0][u]; } ll qr(int u,int v) { if (u==v) return dp1[v]; int tmp=v; ll ans=0; ans+=dp1[v]; v=par[0][v]; while(cId[v]!=cId[u]) { ans+=query(pos[v]-1)-query(pos[cH[cId[v]]]-1); ans+=dp1[v]-dp[tmp]; tmp=cH[cId[v]]; v=par[0][cH[cId[v]]]; } ans+=query(pos[v]-1)-query(pos[u]-1); ans+=dp1[v]-dp[tmp]; return ans; } void dfs(int u,int p=0) { int big=-1,bsz=-1; for(auto v: g[u]) if (v!=p) { if (siz[v]>bsz) bsz=siz[v],big=v; dfs(v,u); dp1[u]+=dp[v]; } dp[u]=dp1[u]; if (big!=-1) update(pos[u],dp1[u]-dp[big]); //if (u==5) cout << "AA: " << qr(5,2)+qr(5,6)-dp[u]+9 << endl; for(auto el: in[u]) { dp[u]=max(dp[u],qr(u,el.ff)+el.ss); } for(auto el: in1[u]) { //if (u==5) cout << qr(u,el.ff.ff)+qr[u,el.ff.ss]-dp1[u] << endl; dp[u]=max(dp[u],qr(u,el.ff.ff)+qr(u,el.ff.ss)-dp1[u]+el.ss); } } int main() { cin.tie(0)->sync_with_stdio(0); cin >> n; For(i,1,n-1) { int u,v; cin >> u >> v; g[u].pb(v); g[v].pb(u); } predfs(1); hld(1); cin >> m; For(i,1,m) { int u,v,w; cin >> u >> v >> w; if (d[u]<d[v]) swap(u,v); if (lca(u,v)==v) { in[v].pb({u,w}); } else { in1[lca(u,v)].pb({{u,v},w}); } } dfs(1); cout << dp[1]; return 0; } /* 7 3 4 6 5 2 7 1 5 7 5 4 5 5 4 3 10 5 6 5 2 6 9 7 2 2 1 3 8 */
#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...