Submission #568192

#TimeUsernameProblemLanguageResultExecution timeMemory
568192sidonFireworks (APIO16_fireworks)C++17
100 / 100
237 ms53924 KiB
#include <bits/stdc++.h>
using namespace std;
#define int int64_t

signed main() {
	ios::sync_with_stdio(0), cin.tie(0);
	int N, M; cin >> N >> M;
	N += M;

	int c[N];
	priority_queue<int> dp[N];
	vector<int> g[N];

	for(int i = 1; i < N; ++i) {
		int p; cin >> p >> c[i];
		g[p-1].push_back(i);
	}

	for(int u = N; u--; ) {
		if(!empty(g[u])) {
			for(int v : g[u]) {
				assert(size(dp[v]) > size(g[v]));
				for(int i = size(g[v]); --i > 0; )
					dp[v].pop();
				assert(size(dp[v]) > 1);
				int x = dp[v].top(); dp[v].pop();
				int y = dp[v].top(); dp[v].pop();
				dp[v].push(x + c[v]);
				dp[v].push(y + c[v]);

				if(size(dp[v]) > size(dp[u]))
					dp[u].swap(dp[v]);
			}
			for(int v : g[u])
				while(!empty(dp[v]))
					dp[u].push(dp[v].top()), dp[v].pop();
		} else {
			dp[u].push(0);
			dp[u].push(0);
		}
	}

	int ans = accumulate(c + 1, c + N, 0LL), d = -M, x {};

	vector<int> res;
	while(!empty(dp[0]))
		res.push_back(dp[0].top()), dp[0].pop();

	for(int i = size(res) - 1; d < 0; --i, ++d) {
		ans += d * (res[i] - x);
		x = res[i];
	}
	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...