Submission #1264520

#TimeUsernameProblemLanguageResultExecution timeMemory
1264520namhhElection Campaign (JOI15_election_campaign)C++20
100 / 100
143 ms29912 KiB
#include <bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
#define fi first
#define se second
const int N = 1e5+1;
const int lg = 17;
int n,m,t[N][lg],h[N],dp[N][2],sta[N],pos[N],ed[N],bits[N],timer = 1;
struct query{
	int u,v,c;
};
query qr[N];
vector<query>aqua[N];
vector<int>adj[N];
void update(int u, int val){
	while(u <= n){
		bits[u] += val;
		u += u & (-u);
	}
}
int query(int u){
	int sum = 0;
	while(u > 0){
		sum += bits[u];
		u -= u & (-u);
	}
	return sum;
}
void dfs(int u, int p){ 
    h[u] = h[p]+1;
    t[u][0] = p;
    for(int i = 1; i <= 16; i++) t[u][i] = t[t[u][i-1]][i-1];
    for(int v : adj[u]){
        if(v == p) continue;
        dfs(v,u);
    } 
}
void dfs1(int u, int p){
	sta[u] = timer;
	pos[timer] = u;
	timer++;
	for(int v: adj[u]){
		if(v != p) dfs1(v,u);
	}
	ed[u] = timer-1;
}
int lca(int u, int v){ 
    if(h[u] < h[v]) swap(u,v); 
    for(int i = 16; i >= 0; i--)
        if(h[t[u][i]] >= h[v]) u = t[u][i];
    if(u == v) return u; 
    for(int i = 16; i >= 0; i--)
        if(t[u][i] != t[v][i]){
            u = t[u][i];
            v = t[v][i];
        }
    return t[u][0];
}
int jump(int v, int u){
	for(int i = 16; i >= 0; i--){
		if(h[t[v][i]] > h[u]) v = t[v][i];
	}
	return v;
}
void dfsdp(int u, int p){
	int sum = 0;
	for(int v: adj[u]){
		if(v != p){
			dfsdp(v,u);
			sum += max(dp[v][0],dp[v][1]);
		}
	}
	dp[u][0] = sum;
	if(!aqua[u].empty()){
	    int mmb = -1e9;
	    for(auto v: aqua[u]){
	    	int aqua = v.c;
		    if(v.u != u){
		    	int t = jump(v.u,u);
		    	aqua += query(sta[v.u])-query(sta[t])+dp[t][0]-max(dp[t][0],dp[t][1]);
			}
			if(v.v != u){
		    	int t = jump(v.v,u);
		    	aqua += query(sta[v.v])-query(sta[t])+dp[t][0]-max(dp[t][0],dp[t][1]);
			}
			mmb = max(mmb,aqua);
	    }
	    dp[u][1] = sum+mmb;
	    update(sta[u],dp[u][0]-max(dp[u][0],dp[u][1]));
	    update(ed[u]+1,max(dp[u][0],dp[u][1])-dp[u][0]);
	}
}
signed main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cin >> n;
	for(int i = 1; i < n; i++){
		int u,v;
		cin >> u >> v;
		adj[u].push_back(v);
		adj[v].push_back(u);
	}
	dfs(1,0);
	dfs1(1,0);
	cin >> m;
	for(int i = 1; i <= m; i++){
		cin >> qr[i].u >> qr[i].v >> qr[i].c;
		int k = lca(qr[i].u,qr[i].v);
		aqua[k].push_back(qr[i]);
	}
	dfsdp(1,0);
//	for(int i = 1; i <= n; i++){
//		for(int j = 0; j <= 1; j++) cout << i << " " << j << " " << dp[i][j] << "\n";
//	}
    cout << max(dp[1][0],dp[1][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...