Submission #170820

#TimeUsernameProblemLanguageResultExecution timeMemory
170820ZwariowanyMarcinElection Campaign (JOI15_election_campaign)C++14
100 / 100
290 ms31216 KiB
#include <bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define ss(x) (int) x.size()
#define pb push_back
#define ll long long
#define cat(x) cerr << #x << " = " << x << endl
#define FOR(i, n) for(int i = 0; i < n; ++i)

using namespace std;	

const int nax = 1e5 + 11;
const int LOG = 16;
const int pod = (1 << 17);

int n;
int a, b;
vector <int> v[nax];
int m, c;
int pre[nax];
int post[nax];
int h[nax];
int jump[nax][LOG + 1];
int cnt;

void dfs(int u, int p) {
	h[u] = h[p] + 1;
	jump[u][0] = p;
	pre[u] = cnt++;
	for(auto it : v[u]) 
		if(it != p)
			dfs(it, u);
	post[u] = cnt;
}

int lca(int x, int y) {
	if(h[x] < h[y])
		swap(x, y);
	for(int i = LOG; 0 <= i; --i)
		if(h[y] <= h[x] - (1 << i))
			x = jump[x][i];
	if(x == y)
		return x;
	for(int i = LOG; 0 <= i; --i) 
		if(jump[x][i] != jump[y][i]) {
			x = jump[x][i];
			y = jump[y][i];
		}
	return jump[x][0];
}

struct gao {
	int a, b, c;
};

vector <gao> V[nax];

struct seg {
	int t[2 * pod];
	
	void init() {
		for(int i = 0; i < 2 * pod; ++i)
			t[i] = 0;
	}
	
	void add(int l, int r, int c) {
		for(l += pod, r += pod; l < r; l /= 2, r /= 2) {
			if(l & 1)
				t[l++] += c;
			if(r & 1)
				t[--r] += c;
		}
	}
	
	int query(int x) {
		int sum = 0;
		x += pod;
		while(x) {
			sum += t[x];
			x /= 2;
		}
		return sum;
	}
} child, node;

int dp[nax];

void solve(int u, int p) {
	int Sum = 0;
	for(auto it : v[u])
		if(it != p) {
			solve(it, u);
			Sum += dp[it];
		}
	child.add(pre[u], post[u], Sum);
	dp[u] = Sum;
	for(auto it : V[u]) {
		int w = child.query(pre[it.a]) + child.query(pre[it.b]) - Sum - node.query(pre[it.a]) - node.query(pre[it.b]) + it.c;
		dp[u] = max(dp[u], w);
	}
	node.add(pre[u], post[u], dp[u]);
}

int main() {
	child.init();
	node.init();
	scanf("%d", &n);
	for(int i = 1; i < n; ++i) {
		scanf("%d %d", &a, &b);
		v[a].pb(b);
		v[b].pb(a);
	}
	dfs(1, 0);

	for(int j = 1; j <= LOG; ++j)
		for(int i = 1; i <= n; ++i)
			jump[i][j] = jump[jump[i][j - 1]][j - 1];
	
	scanf("%d", &m);
	
	for(int i = 1; i <= m; ++i) {
		scanf("%d %d %d", &a, &b, &c);
		V[lca(a, b)].pb({a, b, c});
	}
	
	solve(1, 0);
	
	printf("%d\n", dp[1]);
	
	
	return 0;
}

Compilation message (stderr)

election_campaign.cpp: In function 'int main()':
election_campaign.cpp:108:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d", &n);
  ~~~~~^~~~~~~~~~
election_campaign.cpp:110:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d", &a, &b);
   ~~~~~^~~~~~~~~~~~~~~~~
election_campaign.cpp:120:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d", &m);
  ~~~~~^~~~~~~~~~
election_campaign.cpp:123:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d %d", &a, &b, &c);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
#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...