제출 #997664

#제출 시각아이디문제언어결과실행 시간메모리
997664salmonJobs (BOI24_jobs)C++14
0 / 100
274 ms85192 KiB
#include <bits/stdc++.h> using namespace std; int N; vector<int> root; int h,h1; vector<int> adjlst[300100]; long long int lst[300100]; int parent[300100]; const long long int inf = 2e18; long long int money; priority_queue<pair<long long int,long long int>,vector<pair<long long int,long long int>>,greater<pair<long long int,long long int>>> pq; pair<set<pair<long long int,long long int>>*,long long int> dfs(int i){ //printf("%d",i); pair<int,int> ii = {-1,-1}; vector<pair<set<pair<long long int,long long int>>*,long long int>> v; for(int j : adjlst[i]){ v.push_back(dfs(j)); ii = max({(int)(v.back().first -> size()),v.size() - 1},ii); } //printf("%d",i); set<pair<long long int,long long int>>* sat; long long int offset = 0; long long int va = lst[i]; long long int other = max(0LL,-lst[i]); if(ii.first == -1){ sat = new set<pair<long long int,long long int>>(); if(lst[i] > 0) sat -> insert({0,lst[i]}); } else{ sat = v[ii.second].first; offset = v[ii.second].second; if(lst[i] > 0) sat -> insert({- offset,lst[i]}); } for(int i = 0; i < v.size(); i++){ if(i == ii.second) continue; for(pair<long long int, long long int> pp : *(v[i].first) ){ pp.first = pp.first + v[i].second - offset; sat -> insert(pp); } } //offset -= min(0LL,va); long long int num = 0; while(sat -> lower_bound({-offset + other,inf}) != sat -> begin()){ auto it = sat -> lower_bound({-offset + other,inf}); advance(it,-1); num += it -> second; sat -> erase(it); } if(num != 0) sat -> insert({-offset + other, num}); num = -lst[i]; if(lst[i] < 0){ while(num != 0 && !(sat -> empty())){ auto it = sat -> begin(); long long int temp = min(num, it -> second); num -= temp; if(it -> second == temp){ sat -> erase(it); } else{ pair<long long int, long long int> ii = *it; ii.second = ii.second - temp ; sat -> erase(it); sat -> insert(ii); } } } return {sat,offset}; } int main(){ scanf(" %d",&N); scanf(" %lld",&money); long long int init = money; for(int i = 1; i <= N; i++){ scanf(" %d",&h); scanf(" %d",&h1); if(h1 == 0){ root.push_back(i); } else{ adjlst[h1].push_back(i); } lst[i] = h; } for(int i : root){ pair<set<pair<long long int,long long int>>*,long long int> ii = dfs(i); for(pair<long long int, long long int> pp : *(ii.first)){ pp.first += ii.second; //printf("%d %d\n",pp.first,pp.second); pq.push(pp); } } while(!pq.empty()){ if(money < pq.top().first) break; money += pq.top().second; pq.pop(); } printf("%lld",money - init); } /* 5 104 -103 0 102 1 -103 2 55 3 50 3 */

컴파일 시 표준 에러 (stderr) 메시지

Main.cpp: In function 'std::pair<std::set<std::pair<long long int, long long int> >*, long long int> dfs(int)':
Main.cpp:41:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<std::set<std::pair<long long int, long long int> >*, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   41 |     for(int i = 0; i < v.size(); i++){
      |                    ~~^~~~~~~~~~
Main.cpp:27:19: warning: unused variable 'va' [-Wunused-variable]
   27 |     long long int va = lst[i];
      |                   ^~
Main.cpp: In function 'int main()':
Main.cpp:83:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   83 |  scanf(" %d",&N);
      |  ~~~~~^~~~~~~~~~
Main.cpp:84:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   84 |     scanf(" %lld",&money);
      |     ~~~~~^~~~~~~~~~~~~~~~
Main.cpp:89:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   89 |   scanf(" %d",&h);
      |   ~~~~~^~~~~~~~~~
Main.cpp:90:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   90 |   scanf(" %d",&h1);
      |   ~~~~~^~~~~~~~~~~
#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...