제출 #92447

#제출 시각아이디문제언어결과실행 시간메모리
92447luciocfBiochips (IZhO12_biochips)C++14
100 / 100
630 ms424528 KiB
#include <bits/stdc++.h> using namespace std; const int maxn = 2e5+10; const int maxm = 5e2+10; const int inf = 1e9+10; typedef pair<int, int> pii; struct T { int in, out, v; } t[maxn]; int n, m, root; int num[maxn], tt; int dp[maxn][maxm], in[maxn], out[maxn]; vector<int> grafo[maxn], vv[maxn]; void dfs(int u, int p) { in[u] = ++tt; for (auto v: grafo[u]) if (v != p) dfs(v, u); out[u] = tt; vv[tt].push_back(u); } int main(void) { ios::sync_with_stdio(false); cin.tie(0); cin >> n >> m; for (int i = 1; i <= n; i++) { int p; cin >> p >> num[i]; if (p) { grafo[i].push_back(p); grafo[p].push_back(i); } if (!p) root = i; } dfs(root, 0); for (int i = 0; i <= n; i++) { dp[i][0] = 0; for (int j = 1; j <= m; j++) dp[i][j] = -inf; } for (int i = 1; i <= n; i++) { for (auto u: vv[i]) for (int j = 1; j <= m; j++) dp[i][j] = max({dp[i][j], dp[i-1][j], num[u]+dp[in[u]-1][j-1]}); if (vv[i].size() == 0) for (int j = 1; j <= m; j++) dp[i][j] = dp[i-1][j]; } int ans = 0; for (int i = 1; i <= n; i++) ans = max(ans, dp[i][m]); cout << ans << "\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...