Submission #1166953

#TimeUsernameProblemLanguageResultExecution timeMemory
1166953julia_08Hiring (IOI09_hiring)C++20
34 / 100
1600 ms121420 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const int MAXN = 5e5 + 10; const int MAXQ = 2e4 + 10; struct worker{ int s, q, id; bool operator < (worker b){ if((ll) s * b.q != (ll) b.s * q) return (ll) s * b.q < (ll) b.s * q; return id < b.id; } }; struct node{ ll sum; int sum_id; }; worker a[MAXN]; node seg[4 * MAXQ]; int n; ll w; void update(int x, int lx, int rx, int i){ if(rx < i || lx > i) return; if(lx == rx){ seg[x].sum += lx; seg[x].sum_id ++; return; } int m = (lx + rx) / 2, lc = 2 * x, rc = 2 * x + 1; update(lc, lx, m, i); update(rc, m + 1, rx, i); seg[x].sum = seg[lc].sum + seg[rc].sum; seg[x].sum_id = seg[lc].sum_id + seg[rc].sum_id; } node merge(node a, node b){ return {a.sum + b.sum, a.sum_id + b.sum_id}; } node query(int x, int lx, int rx, int l, int r){ if(rx < l || lx > r) return {0, 0}; if(l <= lx && rx <= r) return seg[x]; int m = (lx + rx) / 2, lc = 2 * x, rc = 2 * x + 1; return merge(query(lc, lx, m, l, r), query(rc, m + 1, rx, l, r)); } int bs(int x, int lx, int rx, ll val){ if(lx == rx) return lx; int m = (lx + rx) / 2, lc = 2 * x, rc = 2 * x + 1; if(seg[lc].sum >= val) return bs(lc, lx, m, val); return bs(rc, m + 1, rx, val - seg[lc].sum); } int main(){ cin.tie(0)->sync_with_stdio(0); cin >> n >> w; for(int i=1; i<=n; i++){ cin >> a[i].s >> a[i].q; a[i].id = i; } sort(a + 1, a + n + 1); ll k = 0; for(int i=1; i<=n; i++){ ll cte = ((w - a[i].s) * a[i].q) / a[i].s; int pos = bs(1, 1, MAXQ, cte); node x = {0, 0}; if(pos > 1) x = query(1, 1, MAXQ, 1, pos - 1); k = max(k, x.sum_id + ((cte - x.sum) / pos) + 1); update(1, 1, MAXQ, a[i].q); } set<pair<int, int>> s; ll sum = 0; for(int i=1; i<k; i++){ s.insert({a[i].q, a[i].id}); sum += a[i].q; } ll num = 1e18, den = 1; int id = -1; for(int i=k; i<=n; i++){ ll cur_num = a[i].s * (sum + a[i].q), cur_den = a[i].q; if(cur_num * den < num * cur_den){ num = cur_num, den = cur_den; id = i; } if(a[i].q < (*s.rbegin()).first){ sum -= (*s.rbegin()).first; s.erase(*s.rbegin()); s.insert({a[i].q, a[i].id}); sum += a[i].q; } } vector<pair<int, int>> workers; for(int i=1; i<id; i++){ workers.push_back({a[i].q, a[i].id}); } sort(workers.begin(), workers.end()); cout << k << "\n"; cout << a[id].id << "\n"; for(int i=0; i<k-1; i++) cout << workers[i].second << "\n"; return 0; }
#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...