# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
242283 | shenxy | Magic Tree (CEOI19_magictree) | C++11 | 1182 ms | 792164 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
#include <map>
using namespace std;
typedef pair<int, int> ii;
int n, m, k, d[100000];
long long dpt1[100000][22], w[100000];
vector<int> adjlist[100000];
long long dp1(int v, int x) {
if (dpt1[v][x] != -1) return dpt1[v][x];
if (x == 0) return dpt1[v][x] = 0;
dpt1[v][x] = (d[v] == x ? w[v] : 0);
for (int i: adjlist[v]) dpt1[v][x] += dp1(i, x);
return dpt1[v][x] = max(dpt1[v][x], dp1(v, x - 1));
}
int cnt = 1;
map<int, ii> mp;
vector<int> adjlist2[1001];
void dfs(int v, int p) {
d[0] = w[0] = 0;
if (mp.find(v) != mp.end()) {
d[cnt] = mp[v].first;
w[cnt] = mp[v].second;
adjlist2[p].push_back(cnt);
p = cnt;
++cnt;
}
for (int i: adjlist[v]) dfs(i, p);
}
long long dpt2[1001][100002];
inline void dp2() {
for (int i = 0; i <= k + 1; ++i) {
for (int j = cnt - 1; j >= 0; --j) {
if (i == 0) dpt2[j][i] = 0;
else {
dpt2[j][i] = (d[j] == i ? w[j] : 0);
for (int k: adjlist2[j]) dpt2[j][i] += dpt2[k][i];
dpt2[j][i] = max(dpt2[j][i], dpt2[j][i - 1]);
}
}
}
}
int main() {
scanf("%d %d %d", &n, &m, &k);
if (k <= 20) {
int p, v, D, W;
for (int i = 1; i < n; ++i) {
scanf("%d", &p);
adjlist[p - 1].push_back(i);
}
fill_n(d, 100000, 0);
fill_n(w, 100000, 0);
for (int i = 0; i < m; ++i) {
scanf("%d %d %d", &v, &D, &W);
d[v - 1] = D;
w[v - 1] = W;
}
memset(dpt1, -1, sizeof dpt1);
printf("%lld", dp1(0, k + 1));
} else if (m <= 1000) {
int p, v, d, w;
for (int i = 1; i < n; ++i) {
scanf("%d", &p);
adjlist[p - 1].push_back(i);
}
for (int i = 0; i < m; ++i) {
scanf("%d %d %d", &v, &d, &w);
mp[v - 1] = ii(d, w);
}
dfs(0, 0);
dp2();
printf("%lld", dpt2[0][k + 1]);
} else {
for (int i = 1; i < n; ++i) scanf("%d", &k);
int v, d, w;
long long ans = 0;
for (int i = 0; i < m; ++i) {
scanf("%d %d %d", &v, &d, &w);
ans += w;
}
printf("%lld", ans);
}
return 0;
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |