Submission #406746

#TimeUsernameProblemLanguageResultExecution timeMemory
406746SeDunionFireworks (APIO16_fireworks)C++17
7 / 100
16 ms23808 KiB
#include<bits/stdc++.h>
#ifndef LOCAL
#define cerr if(false)cerr
#endif // LOCAL
using namespace std;
using ll = long long;
const int N = 1e6 + 66;

ll ans;

vector<pair<int,int>>g[N];

priority_queue<ll>ql;
priority_queue<ll, vector<ll>, greater<ll>>qr;

pair<ll,ll> dfs(int v) {
	if (g[v].empty()) return {0, 0};
	vector<pair<ll,ll>>now;
	for (auto [to, c] : g[v]) {
		auto [nl, nr] = dfs(to);
		now.emplace_back(nl + c, nr + c);
	}
	while(ql.size())ql.pop();
	while(qr.size())qr.pop();
	for (auto [l, r] : now) {
		if (ql.empty() || qr.empty()) {
			assert(ql.empty() && qr.empty());
			ql.push(l);
			qr.push(r);
			continue;
		}
		ll L = ql.top(), R = qr.top();
		if (r <= L) {
			ql.push(l);
			ql.push(r);
			ans += ql.top() - r;
			qr.push(ql.top());
			ql.pop();
		} else if (l >= R) {
			qr.push(l);
			qr.push(r);
			ans += l - qr.top();
			ql.push(qr.top());
			qr.pop();
		} else {
			ql.push(l);
			qr.push(r);
		}
	}
	ll L = ql.top(), R = qr.top();
	return {L, R};
}

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	int n, m;
	cin >> n >> m;
	for (int i = 2 ; i <= n + m ; ++ i) {
		int p, c;
		cin >> p >> c;
		g[p].emplace_back(i, c);
	}
	dfs(1);
	cout << ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...