90 pts,T了,求调
查看原帖
90 pts,T了,求调
1060759
qw1234321楼主2023/11/16 16:16
#include<iostream>
#include<cstring>
#include<cstdio> 
#include<vector>
#define rep(i, a, b) for (int i = a; i <= b; i++)
#define drep(i, a, b) for (int i = a; i >= b; i--)
#define ll long long
using namespace std;

const int N = 1e6 + 100;
vector<int> G[N];
int fa[N], val[N], point;
bool vis[N];
ll dp[N][2];
int n, d;

void add(int from, int to){
	G[from].push_back(to);
	fa[to] = from;
	return ;
} 

int find(int idx){
	vis[idx] = true;
	if (vis[fa[idx]]){
		return fa[idx];
	}
	find(fa[idx]);
}

void dfs(int idx){
	dp[idx][0] = 0;
	dp[idx][1] = val[idx];
	vis[idx] = true;
	for (int p : G[idx]){
		if (p == point){
			continue;
		}
		dfs(p);
		dp[idx][1] += dp[p][0];
		dp[idx][0] += max(dp[p][0], dp[p][1]);
	}
}

ll calc(int idx){
	ll res = 0;
	point = find(idx);
	dfs(point);
	res = max(res, dp[point][0]);
	point = fa[point];
	dfs(point);
	res = max(res, dp[point][0]);
	return res;
}

int main(){
	cin >> n;
	rep(i, 1, n){
		cin >> val[i] >> d;
		add(d, i);		
	}
	ll ans = 0;
	rep(i, 1, n){
		if (!vis[i]){
			ans += calc(i);
		}
	}
	cout << ans;
	return 0;
}
2023/11/16 16:16
加载中...