Submission #739579

#TimeUsernameProblemLanguageResultExecution timeMemory
739579Dan4LifeHiring (IOI09_hiring)C++17
11 / 100
629 ms46652 KiB
#include <bits/stdc++.h> using namespace std; #define fi first #define se second #define pb push_back #define int long long #define sz(a) (int)a.size() #define all(a) a.begin(),a.end() const int mxN = (int)5e5+10; const int mxC = (int)20010; const int LINF = (int)1e18; int n, W; int S[mxN], Q[mxN]; int segTree[2*mxN], total[2*mxN]; void upd(int x, int v, int p=0, int l=1, int r=mxC){ if(l==r){ segTree[p]+=v*l; total[p]+=v; return; } int mid = (l+r)/2; int rp = p+2*(mid-l+1); if(x<=mid) upd(x,v,p+1,l,mid); else upd(x,v,rp,mid+1,r); segTree[p] = segTree[p+1]+segTree[rp]; total[p] = total[p+1]+total[rp]; } int findNum(int x, int p=0, int l=1, int r=mxC){ if(l==r){ int L = 0, R = total[p]; while(L<R){ int mid = (L+R+1)/2; if(mid*l<=x)L=mid; else R=mid-1; } return L; } int mid = (l+r)/2; int rp = p+2*(mid-l+1); if(segTree[p+1]==x) return total[p+1]; if(segTree[p+1]>x) return findNum(x,p+1,l,mid); return total[p+1]+findNum(x-segTree[p+1],rp,mid+1,r); } int findSum(int x, int p=0, int l=1, int r=mxC){ if(l==r) return x*l; int mid = (l+r)/2; int rp = p+2*(mid-l+1); if(total[p+1]==x) return segTree[p+1]; if(total[p+1]>x) return findSum(x,p+1,l,mid); return segTree[p+1]+findSum(x-total[p+1],rp,mid+1,r); } int32_t main() { ios_base::sync_with_stdio(false); cin.tie(0); cin >> n >> W; for(int i = 0; i < n; i++) cin >> S[i] >> Q[i]; vector<int> ord(n,0); iota(all(ord),0); sort(all(ord),[&](int i, int j){ return S[i]*Q[j] > S[j]*Q[i]; }); for(auto i : ord) upd(Q[i],1); int num = 0, saved = 0, ind=-1; for(auto i : ord){ upd(Q[i],-1); int tot = (W*Q[i])/S[i]-1; int curNum = findNum(tot)+1; int curSaved = tot-findSum(curNum-1)+Q[i]; if(num<curNum) num=curNum, saved = curSaved,ind=i; else if(num==curNum and saved<curSaved) num=curNum,saved=curSaved,ind=i; } vector<int> v; multiset<pair<int,int>> S; for(auto i : ord){ if(i==ind){ reverse(all(ord)); for(auto j : ord){ S.insert({Q[j],j}); if(j==ind) break; } int xd = num; while(xd--){ v.pb(S.begin()->se); S.erase(S.begin()); } break; } } cout << num << "\n"; for(auto u : v) cout << u+1 << "\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...