Submission #1246934

#TimeUsernameProblemLanguageResultExecution timeMemory
1246934KindaGoodGamesMagic Tree (CEOI19_magictree)C++20
34 / 100
2102 ms1114112 KiB
#include<bits/stdc++.h>

using namespace std;
#define int long long
#define pii pair<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; 
void findPar(int v, int p, int fp){
    if(v != p) {
        adj[v].push_back(p);
        adj[p].push_back(v);
    }
    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;

    adj.resize(n);
    fruits.resize(n);

    map<int,int> rp;
    vector<int> par(n);
    vector<int> in(n);
    
    adjP.resize(n);
    for(int i = 1; i < n; i++){
        int p;
        cin >> p;
        p--;
        adjP[i].push_back(p);
        adjP[p].push_back(i);
    } 

    set<int> times;
    for(int i = 0; i <m; i++){
        int v, d, w;
        cin >> v >> d >>w;
        v--;
        fruits[v] = {d,w};
        times.insert(d);
    } 

    #pragma region coordinate compression
    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]; 
    }
    k = toInd.size();
    #pragma endregion

    findPar(0,0,0);

    dp.resize(k+1, vector<int>(n));
    DFS(0,0);
    cout << dp[k][0] << endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...