제출 #1065675

#제출 시각아이디문제언어결과실행 시간메모리
1065675raczekJobs (BOI24_jobs)C++17
0 / 100
149 ms39304 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); function<void(int, int)> dfs = [&](int a, int par) { vector<pair<int, int> > sons; for(auto v : graph[a]) if(v != par) { dfs(v, a); sons.push_back(dp[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;} if(c < 0) {dp[a] = {INF, -INF}; return;} int minS = 0; int pref = 0; for(int i=0;i<=k;i++) {minS = max(minS, sons[i].first - pref); pref += sons[i].second;} minS -= cost[a]; dp[a] = {minS, pref + cost[a]}; return; }; dfs(0, -1); priority_queue<pair<int, int> > q; q.push({0, 0}); while(!q.empty()) { auto a = q.top(); debug(a); q.pop(); if(-a.first > s) break; s += cost[a.second]; for(auto v : graph[a.second]) q.push({-dp[v].first, v}); } 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...