Submission #1184861

#TimeUsernameProblemLanguageResultExecution timeMemory
1184861UnforgettableplMagic Tree (CEOI19_magictree)C++20
100 / 100
76 ms31556 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long


int32_t main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int n,m,k;
    cin >> n >> m >> k;
    vector<vector<int>> adj(n+1);
    for(int i=2;i<=n;i++){
        int p;cin>>p;
        adj[p].emplace_back(i);
    }
    vector<int> w(n+1);
    vector<int> d(n+1);
    for(int i=1;i<=m;i++){
        int v,dd,ww;cin>>v>>dd>>ww;
        w[v]=ww;
        d[v]=dd;
    }
    auto combine = [&](map<int,int> &a,map<int,int> &b){
        if(a.size()<b.size())swap(a,b);
        for(auto[i,j]:b){
            a[i]+=j;
        }
    };
    function<map<int,int>(int)> dfs = [&](int x){
        map<int,int> DP;
        for(int&i:adj[x]){
            auto t = dfs(i);
            combine(DP,t);
        }
        if(d[x]){ // is a fruit
            DP[d[x]]+=w[x];
            auto iter = DP.upper_bound(d[x]);
            while(iter!=DP.end() and w[x]){
                int trans = min(iter->second,w[x]);
                w[x]-=trans;
                iter->second-=trans;
                if(iter->second==0)iter=DP.erase(iter);
                else break;                
            }
        }
        return DP;
    };
    auto ans = dfs(1);
    int anss = 0;
    for(auto[i,j]:ans)anss+=j;
    cout << anss << '\n';
}
#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...