제출 #287491

#제출 시각아이디문제언어결과실행 시간메모리
287491dlwocks31Magic Tree (CEOI19_magictree)C++17
58 / 100
344 ms34296 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int MX = 1e5+1;
vector<int> adj[MX];
pair<int, int> fruit[MX];
multiset<pair<int, int>> ms[MX];
void merge(multiset<pair<int, int>>& st, pair<int, int> pr) {
	auto [d, w] = pr;
	auto it = st.lower_bound(make_pair(d+1, -1));
	while(w > 0 && it != st.end()) {
		if(w >= it->second) {
			it = st.erase(it);
			w -= it->second;
		} else {
			st.insert({it->first, it->second - w});
			st.erase(it);
			w = 0;
		}
	}
	st.insert(pr);
}
void dfs(int i, int p) {
	int leaf = 1;
	for(int a: adj[i]) {
		if(a == p) continue;
		leaf = 0;
		dfs(a, i);
	}
	if(leaf) {
		if(fruit[i].first)
			ms[i] = {fruit[i]};
	} else {
		int mx = 0;
		for(int a: adj[i]) {
			if(a == p) continue;
			if(ms[a].size() > ms[mx].size())
				mx = a;
		}
		ms[i] = move(ms[mx]);
		for(int a: adj[i]) {
			if(a == p || a == mx) continue;
			for(auto pr: ms[a]) {
				ms[i].insert(pr);
			}
			ms[a].clear();
		}
		if(fruit[i].first) 
			merge(ms[i], fruit[i]);
	}

}
int32_t main() {
	//ios::sync_with_stdio(0);cin.tie(0);
	int n, m, k;
	cin >> n >> m >> k;
	for(int i=2; i<=n; i++) {
		int p;
		cin >> p;
		adj[p].push_back(i);
		adj[i].push_back(p);
	}
	for(int i=0; i<m; i++) {
		int v, d, w;
		cin >> v >> d >> w;
		fruit[v] = {d, w};
	}
	dfs(1, 0);
	int ans = 0;
	for(auto [d, w]: ms[1]) {
		ans += w;
	}
	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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...