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