제출 #1170272

#제출 시각아이디문제언어결과실행 시간메모리
1170272InvMODMagic Tree (CEOI19_magictree)C++20
100 / 100
94 ms34632 KiB
#include<bits/stdc++.h> using namespace std; #define sz(v) (int)(v).size() template<typename T> bool ckmx(T& a, const T& b){ if(a < b) return a = b, true; return false; } using ll = long long; void solve() { int n,m,k; cin >> n >> m >> k; vector<vector<int>> adj(n + 1, vector<int>()); for(int i = 2; i <= n; i++){ int p; cin >> p; adj[p].push_back(i); } vector<int> day(n + 1, -1), magic(n + 1); for(int i = 1; i <= m; i++){ int v; cin >> v >> day[v] >> magic[v]; } vector<map<int,ll>> dp(n + 1, map<int, ll>()); function<void(int)> calc_dp = [&](int x) -> void{ for(int v : adj[x]){ calc_dp(v); if(sz(dp[x]) < sz(dp[v])) swap(dp[x], dp[v]); for(auto it : dp[v]){ dp[x][it.first] += it.second; } } if(day[x] != -1){ // erase some that is not optimal for our answer like Lis ll cur_sum = 0; for(auto it = dp[x].upper_bound(day[x]); it != dp[x].end(); it = dp[x].upper_bound(day[x])){ cur_sum += it -> second; if(cur_sum <= magic[x]){ // we will erase this to choose x dp[x].erase(it); } else{ // does not reach the last position -> we can't choose x // we erased cur_sum - it.se and add magic[x] cur_sum = cur_sum - (it -> second); it->second += cur_sum - magic[x]; break; } } dp[x][day[x]] += magic[x]; } // cout << "DP: " << x << "\n"; // for(auto it : dp[x]){ // cout << it.first <<" " << it.second << "\n"; // } cout << "\n"; }; calc_dp(1); ll answer = 0; for(auto it : dp[1]) answer += it.second; cout << answer << "\n"; } int32_t main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); #define name "InvMOD" if(fopen(name".INP", "r")){ freopen(name".INP", "r", stdin); freopen(name".OUT", "w", stdout); } solve(); return 0; }

컴파일 시 표준 에러 (stderr) 메시지

magictree.cpp: In function 'int32_t main()':
magictree.cpp:83:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   83 |         freopen(name".INP", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
magictree.cpp:84:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   84 |         freopen(name".OUT", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#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...