Submission #92924

#TimeUsernameProblemLanguageResultExecution timeMemory
92924Dat160601Election Campaign (JOI15_election_campaign)C++17
100 / 100
646 ms31992 KiB
#include <bits/stdc++.h>
using namespace std;
#define mp make_pair
#define pb push_back
#define fi first
#define se second

const int N = 1e5 + 7;

int n, q, u, v, w, cnt = 0, st[N], ed[N], level[N], dp[N], sum[N];
int par[18][N], it[4 * N], lz[4 * N];
vector <int> edge[N];
vector < pair <int, pair <int, int> > > query[N];

void predfs(int u, int p){
	st[u] = ++cnt;
	for(int v : edge[u]){
		if(v == p) continue;
		level[v] = level[u] + 1;
		par[0][v] = u;
		predfs(v, u);
	}
	ed[u] = cnt;
}

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

void lazy(int k, int l, int r){
	if(lz[k] == 0) return;
	it[k] += lz[k];
	if(l != r){
		lz[k << 1] += lz[k];
		lz[k << 1 | 1] += lz[k];
	}
	lz[k] = 0;
}

void update(int k, int l, int r, int L, int R, int val){
	lazy(k, l, r);
	if(l > R || r < L) return;
	if(l >= L && r <= R){
		it[k] += val;
		if(l != r){
			lz[k << 1] += val;
			lz[k << 1 | 1] += val;
		}
		return;
	}
	int mid = (l + r) >> 1;
	update(k << 1, l, mid, L, R, val);
	update(k << 1 | 1, mid + 1, r, L, R, val);
	it[k] = it[k << 1] + it[k << 1 | 1];
}

int get(int k, int l, int r, int pos){
	lazy(k, l, r);
	if(l > pos || r < pos) return 0;
	if(l == r) return it[k];
	int mid = (l + r) >> 1;
	return get(k << 1, l, mid, pos) + get(k << 1 | 1, mid + 1, r, pos);
}

void dfs(int u, int p){
	for(int v : edge[u]){
		if(v == p) continue;
		dfs(v, u);
		sum[u] += dp[v];
	}
	dp[u] = sum[u];
	for(int v : edge[u]){
		if(v == p) continue;
		update(1, 1, n, st[v], ed[v], sum[u] - dp[v]);
	}
	for(int i = 0; i < (int)query[u].size(); i++){
		int a = query[u][i].se.fi, b = query[u][i].se.se;
		int w = query[u][i].fi;
		int lef = get(1, 1, n, st[a]);
		int rig = get(1, 1, n, st[b]);
		dp[u] = max(dp[u], lef + rig + w + sum[a] + sum[b] - sum[u]);
	}
}

int main(){
	scanf("%d", &n);
	for(int i = 1; i < n; i++){
		scanf("%d %d", &u, &v);
		edge[u].pb(v);
		edge[v].pb(u);
	}
	level[1] = 1;
	par[0][1] = 1;
	predfs(1, 1);
	for(int i = 1; i <= 17; i++){
		for(int j = 1; j <= n; j++){
			par[i][j] = par[i - 1][par[i - 1][j]];
		}
	}
	scanf("%d", &q);
	for(int i = 1; i <= q; i++){
		scanf("%d %d %d", &u, &v, &w);
		int lc = lca(u, v);
		query[lc].pb(mp(w, mp(u, v)));
	}
	dfs(1, 1);
	printf("%d", dp[1]);
}

Compilation message (stderr)

election_campaign.cpp: In function 'int main()':
election_campaign.cpp:89:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d", &n);
  ~~~~~^~~~~~~~~~
election_campaign.cpp:91:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d", &u, &v);
   ~~~~~^~~~~~~~~~~~~~~~~
election_campaign.cpp:103:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d", &q);
  ~~~~~^~~~~~~~~~
election_campaign.cpp:105:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d %d", &u, &v, &w);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
#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...