Submission #1199390

#TimeUsernameProblemLanguageResultExecution timeMemory
1199390catch_me_if_you_canFireworks (APIO16_fireworks)C++20
55 / 100
99 ms26300 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define in array<int, 2>
#define pb push_back
#define pob pop_back
#define fast() ios_base::sync_with_stdio(false); cin.tie(NULL)

const int MX = 2e5+5;
const int INF = 1e17;

vector<int> adj[MX];
int w[MX];

multiset<int> dp[MX];
in T[MX];//final function is TRUE T[u][1]*X + T[u][0].

void dfs(int u)
{
	if(adj[u].empty())
	{
		dp[u].insert(w[u]);
		dp[u].insert(w[u]);
		T[u] = {-w[u], 1};
		return;
	}
	for(int v: adj[u])
	{
		dfs(v);
		if((dp[u].size() < dp[v].size()))
		{
			swap(dp[u], dp[v]);
			swap(T[u], T[v]);
		}
		T[u][0]+=T[v][0];
		T[u][1]+=T[v][1];
		for(int X: dp[v])
			dp[u].insert(X);
		dp[v].clear();
	}
	if(u == 1)
		return;
	while(T[u][1] > 1)
	{
		auto it = prev(dp[u].end());
		T[u][1]--;
		T[u][0]+=(*it);
		dp[u].erase(it);
	}
	vector<int> V;
	T[u][0]-=w[u];
	while(T[u][1] >= 0)
	{
		T[u][1]--;
		auto it = prev(dp[u].end());
		V.pb((*it) + w[u]);
		dp[u].erase(it);
	}
	for(auto s: V)
	{
		dp[u].insert(s);
		T[u][1]++;
	}
	return;
}

signed main()
{
	fast();
	int n, m; cin >> n >> m; n+=m;
	for(int i = 2; i <= n; i++)
	{
		int s; cin >> s >> w[i];
		adj[s].pb(i);
	}
	dfs(1);
	int ans = T[1][0];
	while(T[1][1]--)
	{
		auto it = prev(dp[1].end());
		ans+=(*it);
		dp[1].erase(it);
	}
	cout << ans << "\n";
	return 0;
}	
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...