제출 #1168174

#제출 시각아이디문제언어결과실행 시간메모리
1168174_rain_Election Campaign (JOI15_election_campaign)C++20
100 / 100
228 ms39216 KiB
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;

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]=(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 (Get(lef(id),l,m,u,v)+Get(rig(id),m+1,r,u,v));
		}
};
IT tree;

const int N=(int)2e5;
const int MAXLOG=15;
vector<int>ke[N+2];
struct Node{
	int first,second,cost;
};
vector<Node>query[N+2];
int sta[N+2]={},fin[N+2]={},time_dfs=0;
int par[N+2][MAXLOG+2],h[N+2];
int n,q;


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];
}


const LL INF=(LL)1e16;
LL dp[N+2];

void add_range(int u,LL val){
	tree.upd(1,1,time_dfs,sta[u],val);
	tree.upd(1,1,time_dfs,fin[u]+1,-val);
	return;
}
LL Get(int u){
	return tree.Get(1,1,time_dfs,1,sta[u]);
}

void calc(int u,int p){
	for(auto&v:ke[u]){
		if (v==p) continue;
		calc(v,u);
		dp[u]+=dp[v];
	}
	add_range(u,dp[u]);
	LL sum=dp[u];
	for(auto&v:query[u]){
		dp[u]=max(dp[u],sum+Get(v.first)+Get(v.second)-Get(u)*2+v.cost);
	}
	add_range(u,-dp[u]);
}


int main(){
	ios::sync_with_stdio(false);
	cin.tie(0) ; cout.tie(0);
	
	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);
		query[lca].push_back({u,v,c});
	}
	calc(1,0);
	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...