Submission #1064736

#TimeUsernameProblemLanguageResultExecution timeMemory
1064736anangoJobs (BOI24_jobs)C++17
0 / 100
1 ms348 KiB
#include <bits/stdc++.h> #define int long long using namespace std; vector<vector<int>> sons; int n,s; vector<int> vals; vector<int> visited; vector<int> parent; vector<priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>> needfuls; set<pair<int,int>> set_conversion(priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> nv) { set<pair<int,int>> S; while (nv.size()) { S.insert(nv.top()); nv.pop(); } return S; } void dfs(int node) { visited[node] = 1; for (int j:sons[node]) { dfs(j); if (needfuls[node].size()<needfuls[j].size()) { swap(needfuls[node],needfuls[j]); } for (pair<int,int> k:set_conversion(needfuls[j])) { needfuls[node].push(k); } } int requirement,cursum; cursum = vals[node]; if (vals[node]<0) { requirement = -vals[node]; } else { requirement = 0; } while (needfuls[node].size() && cursum<0) { pair<int,int> best = needfuls[node].top(); needfuls[node].pop(); requirement = max(requirement, best.first-cursum); cursum+=best.second; } while (needfuls[node].size() && needfuls[node].top().first-cursum<requirement) { pair<int,int> best = needfuls[node].top(); needfuls[node].pop(); cursum+=best.second; } if (cursum>0) { needfuls[node].push({requirement,cursum}); } } signed main() { #ifndef ONLINE_JUDGE // for getting input from input.txt freopen("input.txt", "r", stdin); // for writing output to output.txt freopen("output.txt", "w", stdout); #endif #ifdef ONLINE_JUDGE ios_base::sync_with_stdio(false); cin.tie(NULL); #endif //fast IO cin >> n >> s; parent=vector<int>(n,-1); sons=vector<vector<int>>(n); vals=vector<int>(n); visited=vector<int>(n,0); needfuls=vector<priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>>(n); for (int i=0; i<n; i++) { int val,prereq; cin >> val >> prereq; prereq--; vals[i] = val; if (prereq!=-1) { sons[prereq].push_back(i); } parent[i] = prereq; } for (int i=0; i<n; i++) { random_shuffle(sons[i].begin(), sons[i].end()); } priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> final_result; for (int root=0; root<n; root++) { if (parent[root]==-1) { dfs(root); for (auto j:set_conversion(needfuls[root])) { final_result.push(j); } } } int cursum = s; while (final_result.size()) { pair<int,int> best = final_result.top(); final_result.pop(); cout << cursum <<" " << best.first <<" " << best.second << endl; if (best.second<0) continue; if (best.first>cursum) break; cursum+=best.second; } int proooooooooofit = cursum-s; cout << proooooooooofit << endl; }

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:58:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   58 |         freopen("input.txt", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:60:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   60 |         freopen("output.txt", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...