제출 #1228010

#제출 시각아이디문제언어결과실행 시간메모리
1228010Mousa_Aboubaker트리 (IOI24_tree)C++20
0 / 100
2097 ms59188 KiB
#include "tree.h" #include <bits/stdc++.h> using namespace std; template <typename T> using pqg = priority_queue<T, vector<T>, greater<T>>; #define SZ(x) (int)x.size() int n; vector<int> p, w; vector<vector<int>> adj; void init(vector<int> P, vector<int> W) { p = P; w = W; n = (int)p.size(); vector ADJ(n, vector<int>()); for (int i = 1; i < n; i++) ADJ[p[i]].push_back(i); adj = ADJ; } long long query(int L, int R) { long long res = 0; vector<long long> cnt(n, 0); auto dfs = [&](auto self, int u) -> pair<long long, pqg<tuple<int, long long, int>>> { if((int)adj[u].size() == 0) { pqg<tuple<int, long long, int>> x; x.push({w[u], L, u}); cnt[u] += L; return make_pair(L, x); } else { long long sum = 0; pqg<tuple<int, long long, int>> pq; for(auto i: adj[u]) { auto x = self(self, i); sum += x.first; if(SZ(x.second) > SZ(pq)) swap(x.second, pq); while(not x.second.empty()) { pq.push(x.second.top()); x.second.pop(); } } long long curr = max(0ll, sum - R); cnt[u] -= curr; sum -= curr; while(!pq.empty()) { auto [ww, vv, ii] = pq.top(); if(vv == L) { pq.pop(); continue; } if(ww >= w[u]) break; if(curr == 0) break; long long mn = min({curr, vv - L}); curr -= mn; cnt[u] += mn; cnt[ii] -= mn; pq.pop(); pq.push({ww, vv - mn, ii}); } pq.push({w[u], sum, u}); return make_pair(sum, pq); } }; dfs(dfs, 0); for(int i = 0; i < n; i++) res += llabs(cnt[i]) * 1ll * w[i]; return res; }
#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...