제출 #1236005

#제출 시각아이디문제언어결과실행 시간메모리
1236005kaltspielerhyMagic Tree (CEOI19_magictree)C++20
0 / 100
495 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}) {
            recolte[noeud][fruits[noeud].first] += fruits[noeud].second;
        }

        int noeudMax = 0;
        for (int iJour = 1; iJour <= K; iJour++) {
            if (recolte[noeud][iJour] > noeudMax) {
                noeudMax = recolte[noeud][iJour];
                result[noeud] = iJour;
            }
        }

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

    int resFinal = 0;
    for (int iVoisin : inverse[1]) {
        // cerr << iVoisin;
        vector<int> vide(K+1, 0);
        recolteFinale(iVoisin, INFINI, vide);
        for (int i = 1; i <= K; i++) resFinal += vide[i];
    }

    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...