Submission #1170036

#TimeUsernameProblemLanguageResultExecution timeMemory
1170036antonnMagic Tree (CEOI19_magictree)C++20
3 / 100
1859 ms8292 KiB
#include <bits/stdc++.h> 

#define F first
#define S second
 
using namespace std;
using ll = long long;
using pi = pair<int, int>;
using vi = vector<int>;
 
template<class T> bool ckmin(T& a, T b) { return b < a ? a = b, true : false; }
template<class T> bool ckmax(T& a, T b) { return a < b ? a = b, true : false; }

const int N = 1e5 + 7;

array<int, 3> f[N];
ll take[N], par[N], when[N];
vector<int> g[N], ord;
ll ans = 0;

void dfs(int u) {
    for (auto v : g[u]) {
        par[v] = u;
        dfs(v);
    }
}

ll get(int u, int same) {
    int x = par[u];
    ll s = 0;
    while (x != 0) {
        if (when[x] != same) {
            s += take[x];
        }
        x = par[x];
    }
    return s;
}

void scoate(int u, int same) {
    int x = par[u];
    while (x != 0) {
        if (when[x] != same) {
            ans -= take[x];
            take[x] = 0;
        }
        x = par[x];
    }
}

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    
    int n, m, k; cin >> n >> m >> k;
    for (int i = 2; i <= n; ++i) {
        int p; cin >> p;
        g[p].push_back(i);
    }
    dfs(1);
    for (int i = 1; i <= m; ++i) {
        cin >> f[i][1] >> f[i][0] >> f[i][2];
    }
    sort(f + 1, f + m + 1);
    
    for (int i = 1; i <= m; ++i) {
        if (f[i][2] >= get(f[i][1], f[i][0])) {
            scoate(f[i][1], f[i][0]);
            take[f[i][1]] = f[i][2];
            when[f[i][1]] = f[i][0];
            ans += f[i][2];
        }
    }
    cout << ans << "\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...