제출 #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...