11pts求调
查看原帖
11pts求调
700558
williamwei楼主2024/10/24 19:33
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 3e5 + 10;
int n, m, a[maxn];
ll st, ans, f[maxn], g[maxn];
vector<int> e[maxn];
void dfs(int u) {
	for (int v : e[u]) dfs(v);
	sort(e[u].begin(), e[u].end(), [](int x, int y) {return g[x] < g[y]; });
	f[u] += a[u]; g[u] -= a[u];
	for (int v : e[u]) if (f[v]) {
		if (g[v] > f[u]) g[u] = max(g[u], g[v] - f[u]);
		f[u] += f[v];
	} f[u] = max(f[u], 0ll); g[u] = max(g[u], 0ll);
}
void dfs2(int u) {
	if (!f[u] || ans + a[u] < 0) return;
	if (g[u] <= ans) { ans += f[u]; return; }
	ll res = ans; ans += a[u];
	for (int v : e[u]) dfs2(v);
	if (ans < res) ans = res;
}
int main() {
	ios::sync_with_stdio(false);
	cin >> n >> st; ans = st;
	for (int i = 1, x; i <= n; i++) cin >> a[i] >> x, e[x].push_back(i);
	dfs(0); dfs2(0); cout << ans - st << '\n';
	return 0;
}
2024/10/24 19:33
加载中...