제출 #1302200

#제출 시각아이디문제언어결과실행 시간메모리
1302200KindaGoodGamesJobs (BOI24_jobs)C++20
100 / 100
438 ms107972 KiB
/* See BOI editorial for Idea. We just use a multiset to store instead of a set, since there may be duplicates. Note: Usually, you should try to avoid multisets, however, insertion is only O(log m). Only .count() is running in O(log m + k), so we are safe here. Removal via keys is O(log m + k) too, however, only amortized only O(log m). */ #include<bits/stdc++.h> using namespace std; #define int long long #define pii pair<int,int> #define tiii tuple<int,int,int> int mod = 1e9+7; int INF = numeric_limits<int>::max()/32; vector<vector<int>> adj; vector<int>val; vector<multiset<pii>> order; void DFS(int v){ for(auto u : adj[v]){ DFS(u); } for(auto u : adj[v]){ if(order[u].size() > order[v].size()) swap(order[u],order[v]); for(auto b : order[u]){ order[v].insert(b); } } pii b = {max(0LL,-val[v]), val[v]}; while(order[v].size() && ( (b.first >= (*(order[v].begin())).first) || b.second <= 0)){ int m,s; tie(m,s) = *order[v].begin(); order[v].erase(order[v].begin()); b = {max(b.first,m-b.second), b.second+s}; } if(b.second >= 0) order[v].insert(b); } int32_t main(){ int n, s; cin >> n >> s; int os = s; val.resize(n+1); adj.resize(n+1); order.resize(n+1); vector<tiii> nodes; priority_queue<tiii, vector<tiii>,greater<tiii>> pq; int c = 0; int mi = 0; int req = -1; vector<int> tba; for(int i = 1; i <= n; i++){ cin >> val[i]; int p; cin >> p; adj[p].push_back(i); } DFS(0); int tot = 0; vector<pii> blocks(order[0].begin(),order[0].end()); for(auto [mini, profit] : blocks){ assert(profit >= 0); if(s < mini) break; s += profit; } cout << s-os << "\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...