Submission #1165980

#TimeUsernameProblemLanguageResultExecution timeMemory
1165980Math4Life2020Jobs (BOI24_jobs)C++20
100 / 100
292 ms110348 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; using pii = pair<ll,ll>; const ll Nm = 3e5+5; map<ll,ll> m0[Nm]; ll fz(ll a, ll b) { if (a==-1) { return b; } if (b==-1) { return a; } if (m0[a].size()>m0[b].size()) { swap(a,b); } for (pii p0: m0[a]) { m0[b][p0.first]+=p0.second; } //cout << "fusing, returning b="<<b<<"\n"; return b; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); ll N,S; cin >> N >> S; ll x[N]; ll p[N]; vector<ll> fadj[N]; vector<ll> fadjZ; //fadj zero ll madd[N]; //memory address for (ll i=0;i<N;i++) { cin >> x[i] >> p[i]; madd[i]=i; p[i]--; if (p[i]==-1) { fadjZ.push_back(i); } else { fadj[p[i]].push_back(i); } } for (ll y=(N-1);y>=0;y--) { for (ll z: fadj[y]) { madd[y]=fz(madd[y],madd[z]); } ll A = madd[y]; if (x[y]>=0) { m0[A][0]+=x[y]; } else { vector<ll> delc; //delete coordinates ll val = -x[y]; //negative of value ll ov = -x[y]; //current overheard while (!m0[A].empty() && val>0) { auto A0 = m0[A].begin(); pii pstr = *A0; //{operation overhead, additional value} m0[A].erase(A0); ov = max(ov,pstr.first+val); val = val - pstr.second; } if (val<=0) { m0[A][ov]+=(-val); } } } ll A= -1; for (ll y: fadjZ) { A = fz(A,madd[y]); } ll S0 = S; while (!m0[A].empty()) { auto A0 = m0[A].begin(); pii p0 = *A0; m0[A].erase(A0); if (S>=p0.first) { S += p0.second; } else { break; } } cout << (S-S0) << "\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...