#include<bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
#define tiii tuple<int,int,int>
int n, m, k;
vector<pii> fruits;
vector<vector<int>> adj;
vector<vector<int>> dp;
void DFS(int v, int p){
for(auto u : adj[v]){
if(u == p) continue;
DFS(u,v);
}
for(int t = 1; t <= k; t++){
int s = 0;
for(auto u : adj[v]){
s += dp[t][u];
}
int add = 0;
if(t == fruits[v].first){
add += fruits[v].second;
}
dp[t][v] = max(s + add, dp[t-1][v]);
}
}
vector<vector<int>> adjP;
vector<pii> edges;
void findPar(int v, int p, int fp){
if(v != p && fruits[v].second != 0) {
edges.push_back({v,p});
}
if(fruits[v].second != 0){
p = v;
}
for(auto u : adjP[v]){
if(u == fp){
continue;
}
findPar(u ,p,v);
}
}
int32_t main(){
cin >> n >> m >> k;
fruits.resize(n);
adjP.resize(n);
map<int,int> rp;
vector<int> par(n);
vector<int> in(n);
vector<tiii> fruitsRaw(m);
for(int i = 1; i < n; i++){
int p;
cin >> p;
p--;
adjP[i].push_back(p);
adjP[p].push_back(i);
}
#pragma region coordinate compression
{
set<int> times;
for(int i = 0; i <m; i++){
int v, d, w;
cin >> v >> d >>w;
v--;
fruits[v] = {d,w};
fruitsRaw[i] = {v,d,w};
times.insert(d);
}
times.insert(0);
vector<int> sorted(times.begin(),times.end());
map<int,int> toInd;
for(int i = 0; i < sorted.size(); i++){
toInd[sorted[i]] = i;
}
for(int i = 0; i < n; i++){
fruits[i].first = toInd[fruits[i].first];
}
for(int i = 0; i < m; i++){
int v,d,w;
tie(v,d,w) = fruitsRaw[i];
fruitsRaw[i] = {v,toInd[d],w};
}
k = toInd.size();
}
#pragma endregion
findPar(0,0,0);
// do it again
set<int> occ;
for(int i = 0; i < edges.size(); i++){
occ.insert(edges[i].first);
occ.insert(edges[i].second);
}
vector<int> sorted(occ.begin(),occ.end());
map<int,int> toInd;
for(int i = 0; i < sorted.size(); i++){
toInd[sorted[i]] = i;
}
for(int i = 0; i < edges.size(); i++){
edges[i] = {toInd[edges[i].first],toInd[edges[i].second]};
}
n = toInd.size();
// recalibrate
adj.resize(n);
for(int i = 0; i < edges.size(); i++){
adj[edges[i].first].push_back(edges[i].second);
adj[edges[i].second].push_back(edges[i].first);
}
fruits = vector<pii>(n);
for(int i = 0; i < m; i++){
int v,d,w;
tie(v,d,w) = fruitsRaw[i];
fruits[toInd[v]] = {d,w};
}
dp.resize(k+1, vector<int>(n));
DFS(0,0);
cout << dp[k][0] << endl;
}
# | 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... |