제출 #1214819

#제출 시각아이디문제언어결과실행 시간메모리
1214819biankJobs (BOI24_jobs)C++20
100 / 100
178 ms86464 KiB
#include <bits/stdc++.h> using namespace std; #define forn(i,n) for(int i=0;i<int(n);i++) #define forsn(i,s,n) for(int i=int(s);i<int(n);i++) #define dforn(i,n) for(int i=int(n)-1;i>=0;i--) #define dforsn(i,s,n) for(int i=int(n)-1;i>=int(s);i--) #define fst first #define snd second #define pb push_back #define eb emplace_back #define sz(x) (int)x.size() #define all(x) x.begin(), x.end() typedef long long ll; typedef vector<ll> vll; typedef vector<int> vi; typedef pair<int,int> ii; const int N = 3e5 + 9; vi adj[N]; ll x[N]; int p[N]; struct Element { ll sum, mini; int first; Element(ll a, ll b, int c) : sum(a), mini(b), first(c) {} bool operator<(const Element &o) const { if (mini != o.mini) return mini < o.mini; return sum > o.sum; } }; priority_queue<Element> pq[N]; void dfs(int u) { for (int v : adj[u]) { dfs(v); if (sz(pq[v]) > sz(pq[u])) { swap(pq[u], pq[v]); } while (!pq[v].empty()) { pq[u].push(pq[v].top()); pq[v].pop(); } } Element e = {x[u], min(x[u], 0LL), u}; while (!pq[u].empty() && (e.sum <= 0 || pq[u].top().mini >= e.mini)) { e.mini = min(e.mini, e.sum + pq[u].top().mini); e.sum += pq[u].top().sum; pq[u].pop(); } if (e.sum > 0) { pq[u].push(e); } } int main() { ios::sync_with_stdio(0); cin.tie(0); int n; ll s; cin >> n >> s; forsn(i, 1, n + 1) { cin >> x[i] >> p[i]; adj[p[i]].push_back(i); } dfs(0); ll res = s; while (!pq[0].empty()) { auto e = pq[0].top(); pq[0].pop(); if (res + e.mini < 0) break; res += e.sum; } cout << res - s << '\n'; return 0; }
#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...