Submission #501984

#TimeUsernameProblemLanguageResultExecution timeMemory
501984blueHiring (IOI09_hiring)C++17
100 / 100
426 ms28080 KiB
#include <iostream> #include <vector> #include <algorithm> #include <set> using namespace std; using ll = long long; #define sz(x) int(x.size()) struct worker { ll S; ll Q; int i; }; struct frac { ll n; ll d; }; bool operator < (frac A, frac B) { if(B.d * A.d < 0) return A.n * B.d > B.n * A.d; else return A.n * B.d < B.n * A.d; } worker P[1+500'000]; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int N; cin >> N; ll W; cin >> W; for(int i = 1; i <= N; i++) { cin >> P[i].S >> P[i].Q; P[i].i = i; } sort(P+1, P+N+1, [] (worker u, worker v) { return u.S * v.Q < v.S * u.Q; }); multiset<ll> qual; ll qual_sum = 0; pair<ll, frac> ans{0, {0,1}}; //workers, -money, take max int ans_ind = -1; for(int i = 1; i <= N; i++) { qual.insert(P[i].Q); qual_sum += P[i].Q; // while(qual_sum * (P[i].S / P[i].Q) > W) while(qual_sum * P[i].S > W * P[i].Q) { qual_sum -= *qual.rbegin(); qual.erase(qual.find(*qual.rbegin())); } pair<ll, frac> curr = {sz(qual), frac{-qual_sum * P[i].S, P[i].Q}}; if(curr > ans) { ans = curr; ans_ind = i; } } sort(P+1, P+ans_ind+1, [] (worker u, worker v) { return u.Q < v.Q; }); cout << ans.first << '\n'; for(int i = 1; i <= ans.first; i++) cout << P[i].i << '\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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...