Submission #1236030

#TimeUsernameProblemLanguageResultExecution timeMemory
1236030kaltspielerhyMagic Tree (CEOI19_magictree)C++20
0 / 100
480 ms1114112 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int INFINI = 1e18;
vector<vector<int>> recolte;
vector<int> parents;
vector<pair<int, int>> fruits;
vector<vector<int>> inverse;
vector<int> result;
int N, M, K;

void recolteFinale(int noeud, int minRencontre, vector<int>& listed) {
    // cerr << noeud;
    if (result[noeud] < minRencontre) {
        listed[result[noeud]] += recolte[noeud][result[noeud]];
        for (int iJour = 1; iJour <= K; iJour++) {
            if (iJour != result[noeud]) {
                listed[iJour] = max(0LL, listed[iJour]-recolte[noeud][iJour]);
            }
        }

        minRencontre = result[noeud];
    }

    for (int iVoisin : inverse[noeud]) {
        recolteFinale(iVoisin, minRencontre, listed);
    }
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    cin >> N >> M >> K;
    recolte.assign(N+1, vector<int>(K+1, 0));
    parents.assign(N+1, -1);
    fruits.assign(N+1, {-1, -1});
    inverse.assign(N+1, vector<int>());
    result.assign(N+1, -1);

    for (int iArete = 2; iArete <= N; iArete++) {
        cin >> parents[iArete];
        inverse[parents[iArete]].push_back(iArete);
    }
    for (int iFruit = 1; iFruit <= M; iFruit++) {
        int noeud, jour, jus;
        cin >> noeud >> jour >> jus;
        fruits[noeud] = {jour, jus};
    }


    queue<int> bfs;
    vector<int> nbEnfants(N+1);
    for (int i = 1; i <= N; i++) {
        nbEnfants[i] = inverse[i].size();
        if (inverse[i].size() == 0) bfs.push(i);
    }


    while (!bfs.empty()) {
        int noeud = bfs.front();
        bfs.pop();

        if (fruits[noeud] != (pair<int, int>){-1, -1}) {
            int sumAct = 0;
            for (int i = K; i > fruits[noeud].first; i--) {
                sumAct += recolte[noeud][i];
            }
            if (fruits[noeud].second > sumAct) {
                for (int i = K; i > fruits[noeud].first; i--) {
                    recolte[noeud][i] = 0;
                }
                recolte[noeud][fruits[noeud].first] += fruits[noeud].second;
            }
        }

        for (int iJour = 1; iJour <= K; iJour++) {
            recolte[parents[noeud]][iJour] += recolte[noeud][iJour];
        }
        nbEnfants[parents[noeud]]--;
        if (nbEnfants[parents[noeud]] == 0 && parents[noeud] != 1) bfs.push(parents[noeud]);
    }

    int resFinal = 0;
    for (int iRec : recolte[1]) {
        // cerr << iVoisin;
        resFinal += iRec;
    }

    cout << resFinal << '\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...