Submission #1246936

#TimeUsernameProblemLanguageResultExecution timeMemory
1246936KindaGoodGamesMagic Tree (CEOI19_magictree)C++20
34 / 100
2124 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<map<int,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); 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...