제출 #240676

#제출 시각아이디문제언어결과실행 시간메모리
240676karmaMagic Tree (CEOI19_magictree)C++14
47 / 100
2136 ms625044 KiB
#include <bits/stdc++.h>
#define pb          emplace_back
#define ll          long long
#define fi          first
#define se          second
#define mp          make_pair
//#define int         int64_t

using namespace std;

const int N = int(1e5) + 10;
typedef pair<int, int> pii;

int n, m, k, p;
vector<int> adj[N];
pii fr[N];
map<int, ll> f[N];

void dfs(int u) {
    for(int v: adj[u]) dfs(v);
    sort(adj[u].begin(), adj[u].end(), [&](const int& x, const int& y){
            return f[x].size() < f[y].size();
         });
    for(int v: adj[u]) {
        for(auto ff: f[v]) {
            auto it = f[u].upper_bound(ff.fi);
            if(it == f[u].begin()) f[u].emplace(ff.fi, 0);
            else {
                it = prev(it);
                if(it->fi != ff.fi) f[u].emplace(ff.fi, it->se);
            }
        }
        for(auto& ff: f[u]) {
            auto it = f[v].upper_bound(ff.fi);
            if(it == f[v].begin()) continue;
            it = prev(it);
            ff.se += it->se;
        }
    }
    if(fr[u].fi) {
        ll ans = fr[u].se;
        auto it = f[u].upper_bound(fr[u].fi);
        if(it == f[u].begin()) f[u].emplace(fr[u].fi, ans);
        else {
            it = prev(it);
            if(it->fi == fr[u].fi) it->se += ans, ans = it->se;
            else f[u].emplace(fr[u].fi, ans += it->se);
        }
        while(1) {
            auto it = f[u].upper_bound(fr[u].fi);
            if(it == f[u].end() || it->se > ans) break;
            f[u].erase(it);
        }
    }
}

int32_t main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    #define Task        "test"
    if(fopen(Task".inp", "r")) {
        freopen(Task".inp", "r", stdin);
        freopen(Task".out", "w", stdout);
    }
    cin >> n >> m >> k;
    for(int i = 2; i <= n; ++i) {
        cin >> p;
        adj[p].pb(i);
    }
    for(int v, d, w, i = 1; i <= m; ++i) {
        cin >> v >> d >> w;
        fr[v] = mp(d, w);
    }
    dfs(1);
    ll res = 0;
    for(auto ff: f[1]) res = max(res, ff.se);
    cout << res;
}

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

magictree.cpp: In function 'int32_t main()':
magictree.cpp:62:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
         freopen(Task".inp", "r", stdin);
         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
magictree.cpp:63:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
         freopen(Task".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...