Submission #1296450

#TimeUsernameProblemLanguageResultExecution timeMemory
1296450Jawad_Akbar_JJElection Campaign (JOI15_election_campaign)C++20
100 / 100
189 ms31484 KiB
#include <iostream>
#include <vector>

using namespace std;
const int N = 1<<17;
int dp[N], ft[N], ch[N], chSum[N], Par[N][20], hei[N], st[N], cur;
vector<int> nei[N];
vector<pair<int, pair<int, int>>> Vec[N];

void Add(int i, int v){
	for (; i < N; i += i & -i)
		ft[i] += v;
}
int get(int i, int ans = 0){
	for (; i; i -= i & -i)
		ans += ft[i];
	return ans;
}

void dfs(int u, int p){
	Par[u][0] = p, hei[u] = hei[p] + 1, st[u] = ++cur, ch[u] = 1;
	for (int i=0;i<17;i++)
		Par[u][i+1] = Par[Par[u][i]][i];

	for (int i : nei[u]){
		if (i == p)
			continue;
		dfs(i, u);
		ch[u] += ch[i];
	}
}

void dfs2(int u, int p){
	for (int i : nei[u]){
		if (i == p)
			continue;
		dfs2(i, u);
		chSum[u] += dp[i];
	}

	dp[u] = chSum[u];
	for (auto [c, lr] : Vec[u]){
		auto [l, r] = lr;
		auto [l1, r1] = lr;

		for (int i=17;i>=0;i--){
			if (hei[u] + (1<<i) < hei[l1])
				l1 = Par[l1][i];
			if (hei[u] + (1<<i) < hei[r1])
				r1 = Par[r1][i];
		}

		if (l == r)
			dp[u] = max(dp[u], chSum[u] + c);
		else if (l == u)
			dp[u] = max(dp[u], chSum[u] - dp[r1] + chSum[r] + get(st[r]) + c);
		else
			dp[u] = max(dp[u], chSum[u] - dp[r1] - dp[l1] + chSum[l] + chSum[r] + get(st[r]) + get(st[l]) + c);
	}

	for (int i : nei[u]){
		if (i == p)
			continue;
		Add(st[i], chSum[u] - dp[i]);
		Add(st[i] + ch[i], dp[i] - chSum[u]);
	}
}

int LCA(int u, int v){
	if (hei[u] > hei[v])
		swap(u, v);

	for (int i=17;i>=0;i--){
		if (hei[u] + (1<<i) <= hei[v])
			v = Par[v][i];
	}

	for (int i=17;i>=0;i--){
		if (Par[u][i] != Par[v][i])
			u = Par[u][i], v = Par[v][i];
	}
	return (u == v ? u : Par[u][0]);
}

int main(){
	ios_base::sync_with_stdio(false); cin.tie(NULL);
	int n, q;
	cin>>n;

	for (int i=1;i<n;i++){
		int a, b;
		cin>>a>>b;

		nei[a].push_back(b);
		nei[b].push_back(a);
	}

	dfs(1, 0);


	cin>>q;
	for (int i=1;i<=q;i++){
		int l, r, c;
		cin>>l>>r>>c;

		if (hei[l] > hei[r])
			swap(l, r);
		Vec[LCA(l, r)].push_back({c, {l, r}});
	}
	dfs2(1, 0);

	cout<<dp[1]<<endl;
}
#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...