제출 #1170027

#제출 시각아이디문제언어결과실행 시간메모리
1170027antonnMagic Tree (CEOI19_magictree)C++20
3 / 100
1794 ms8140 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]; 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 x = par[u]; ll s = 0; while (x != 0) { s += take[x]; x = par[x]; } return s; } void kill(int u) { int x = par[u]; while (x != 0) { 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])) { kill(f[i][1]); take[f[i][1]] = f[i][2]; 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...