Submission #1065985

#TimeUsernameProblemLanguageResultExecution timeMemory
1065985raczekJobs (BOI24_jobs)C++17
0 / 100
275 ms122824 KiB
#include<bits/stdc++.h> using namespace std; #ifdef DEBUG auto& operator <<(auto& o, pair<auto, auto> p) {return o<<"{"<<p.first<<", "<<p.second<<"}";} auto& operator <<(auto& o, auto x) {o<<"{"; for(auto v : x) o<<v<<", "; return o<<"}";} #define debug(X) cerr<<"["#X"]: "<<X<<endl; #else #define debug(X) {} #endif #define int long long const int INF = numeric_limits<int>::max(); int32_t main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n, s; cin>>n>>s; int org = s; vector<vector<int> > graph(n+1); vector<int> cost(n+1); for(int i=1;i<=n;i++) { int p, c; cin>>c>>p; graph[p].push_back(i); cost[i] = c; } vector<pair<int, int> > dp(n+1); vector<unordered_set<int> > nwGraph(n+1); function<void(int)> dfs = [&](int a) { vector<pair<int, pair<int, int> > > sons; for(auto v : graph[a]) { dfs(v); sons.push_back({dp[v].first, {dp[v].second, v}}); } sort(sons.begin(), sons.end()); int k = -1, c = cost[a]; while(c < 0 && k != (int)sons.size()-1) {k++; c += sons[k].second.first;} if(c < 0) {dp[a] = {INF, -INF}; return;} int minS = -cost[a]; int pref = 0; for(int i=0;i<=k;i++) { minS = max(minS, sons[i].first-pref-cost[a]); pref += sons[i].second.first; nwGraph[a].insert(sons[i].second.second); } dp[a] = {minS, c}; return; }; dfs(0); priority_queue<pair<int, int> > q; function<void(int)> del = [&](int a) { s += cost[a]; for(auto v : graph[a]) { if(nwGraph[a].find(v) == nwGraph[a].end()) q.push({-dp[v].first, v}); else del(v); } }; q.push({0, 0}); while(!q.empty()) { auto a = q.top(); debug(a); q.pop(); assert(-a.first <= s); assert(dp[a.second].second >= 0); del(a.second); } assert(s >= org); cout<<s-org; }
#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...