Submission #1155657

#TimeUsernameProblemLanguageResultExecution timeMemory
1155657adiyerJobs (BOI24_jobs)C++20
100 / 100
404 ms59652 KiB
#include <bits/stdc++.h> #define F first #define S second #define pb push_back #define len(x) (ll) x.size() #define all(x) x.begin(), x.end() using namespace std; typedef long long ll; const int N = 3e5 + 11; const ll inf = 2e18 + 12; ll n, s, prf; ll p[N], a[N], rt[N]; vector < ll > g[N]; struct node{ ll r, p; bool operator >(const node &x) const { if(r == x.r) return p > x.p; else return r > x.r; } }; priority_queue < node, vector < node >, greater < node > > q[N]; ll mrg(ll x, ll y){ if(len(q[x]) < len(q[y])) swap(x, y); while(len(q[y])) q[x].push(q[y].top()), q[y].pop(); return x; } void cmb(ll v, node x){ while(len(q[v])){ node u = q[v].top(); if(x.p <= 0) q[v].pop(), x = {max(x.r, u.r - x.p), u.p + x.p}; else{ if(x.r > u.r) q[v].pop(), x = {x.r, u.p + x.p}; else{ q[v].push(x); break; } } } if(q[v].empty()) q[v].push(x); if(len(q[v]) == 1 && q[v].top().p <= 0) q[v].pop(); } void dfs(ll v){ if(g[v].empty()) rt[v] = v; for(ll u : g[v]){ dfs(u); if(!rt[v]) rt[v] = rt[u]; else rt[v] = mrg(rt[v], rt[u]); } cmb(rt[v], {max(0ll, -a[v]), a[v]}); } signed main(){ cin >> n >> s, prf = s; for(ll i = 1; i <= n; i++) cin >> a[i] >> p[i], g[p[i]].pb(i); dfs(0); ll v = rt[0]; while(len(q[v])){ if(prf >= q[v].top().r) prf += q[v].top().p; q[v].pop(); } cout << prf - s; }
#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...