제출 #220167

#제출 시각아이디문제언어결과실행 시간메모리
220167manh9203Designated Cities (JOI19_designated_cities)C++17
100 / 100
456 ms55416 KiB
#include<bits/stdc++.h>

using namespace std;

#define ll long long
#define fi first
#define se second
typedef pair<ll, ll> pii;
const int N = 2e5 + 5;

int n, q;
vector<pair<int, pii> > adj[N];
ll curSum, Max, root;
ll ans[N], sum[N];
pii maxChild[N];
int par[N], val[N];
int check[N];

ll dfs1(int u, int p) {
	ll res = 0;
	for (auto e : adj[u]) {
		int v = e.fi;
		if (v != p) {
			res += dfs1(v, u) + e.se.se;
		}
	}
	return res;
}

void dfs2(int u, int p) {
	Max = max(Max, curSum);
	sum[u] = curSum;
	for (auto e : adj[u]) {
		int v = e.fi;
		if (v != p) {
			curSum += e.se.fi - e.se.se;
			dfs2(v, u);
			curSum += e.se.se - e.se.fi;
		}
	}
}

ll dist[N], distVal[N];
ll maxVer[N];
ll mx;
pair<int, int> best;

void dfs3(int u, int p) {
	distVal[u] = sum[u] + dist[u];
	maxVer[u] = u;
	for (auto e : adj[u]) {
		int v = e.fi;
		if (v != p) {
			dist[v] = dist[u] + e.se.fi + e.se.se;
			dfs3(v, u);
			if (distVal[maxVer[v]] + distVal[maxVer[u]] - 2 * dist[u] > mx) {
				mx = distVal[maxVer[v]] + distVal[maxVer[u]] - 2 * dist[u];
				best = {maxVer[u], maxVer[v]};
			}
			if (distVal[maxVer[v]] > distVal[maxVer[u]]) {
				maxVer[u] = maxVer[v];
			}
		}
	}
}

void dfs(int u, int p) {
	maxChild[u] = {val[u], u};
	for (auto e : adj[u]) {
		int v = e.fi;
		if (v != p) {
			par[v] = u;
			val[v] = e.se.fi;
			dfs(v, u);
			if (maxChild[v].fi + val[u] > maxChild[u].fi) {
				maxChild[u].fi = maxChild[v].fi + val[u];
				maxChild[u].se = maxChild[v].se;
			}
		}
	}
}

int main() {
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	
	cin >> n;
	ll sumEdge = 0;
	for (int i = 1; i < n; i++) {
		int u, v, a, b;
		cin >> u >> v >> a >> b;
		adj[u].push_back({v, {a, b}});
		adj[v].push_back({u, {b, a}});
		sumEdge += a + b;
	}
	curSum = dfs1(1, 1); 
	dfs2(1, 1);
	
	dfs3(1, 1);
	root = best.fi;
	ans[1] = sum[root];
	dfs(root, root);
	priority_queue<pii> pq;
	pq.push(maxChild[root]);
	for (int i = 2; i <= n; i++) {
		ans[i] = ans[i - 1];
		if (pq.size() > 0) {
			ans[i] += pq.top().fi;
			int u = pq.top().se;
			pq.pop();
			while (u != 0 && check[u] == 0) {
				check[u] = 1;
				for (auto e : adj[u]) {
					if (e.fi != par[u] && check[e.fi] == 0) {
						pq.push(maxChild[e.fi]);
					}
				}
				u = par[u];
			}
		}
	}
	ans[1] = Max;
	
	cin >> q;
	while (q--) {
		int x;
		cin >> x;
		cout << sumEdge - ans[x] << "\n";
	}
}
#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...