제출 #1300060

#제출 시각아이디문제언어결과실행 시간메모리
1300060pragmatist바이오칩 (IZhO12_biochips)C++17
100 / 100
379 ms11696 KiB
#include<bits/stdc++.h>

using namespace std;

const int N = (int)2e5+7;
const int inf = (int)1e9+7;

int n, dp[N][2];
vector<int> g[N];
int l[N], r[N];
int a[N], tin[N], tout[N], timer;

void dfs(int v, int pr) {
	tin[v] = ++timer;
	l[v] = tin[v];
	for(auto to : g[v]) {
		if(to == pr) {
			continue;
		}
		dfs(to, v);
	}
	tout[v] = timer;
	r[v] = tout[v];
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	int m;
	cin >> n >> m;
	int root = 0;
	for(int i = 1; i <= n; i++) {
		int pr;
		cin >> pr;
		cin >> a[i];
		if(pr == 0) {
			root = i;
		} else {
			g[pr].push_back(i);
		}
	}
	dfs(root, 0);    
	for(int k = 1; k <= m; k++) {
		//1 = k
		//0 = k-1
		for(int i = 1; i <= n; i++) {
			dp[r[i]][1] = max(dp[r[i]][1], dp[l[i]-1][0]+a[i]);
		}
		for(int i = 1; i <= n; i++) {
			dp[i][1] = max(dp[i][1], dp[i-1][1]);
		}
		for(int i = 0; i <= n; i++) {
			dp[i][0] = dp[i][1];
			dp[i][1] = -inf;
		}
	}          
	cout << dp[n][0];
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...