This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define mp make_pair
#define pb emplace_back
#define fi first
#define se second
#define int long long
#define inf 1e18
#define ick cout<<"ickbmi32.9\n"
using namespace std;
pair<pair<int, int>, int> arr[500005];
int n, w;
bool cmp(pair<pair<int, int>, int> a, pair<pair<int, int>, int> b) {
return a.fi.se * b.fi.fi > b.fi.se * a.fi.fi;
}
bool le(pair<int, int> a, pair<int, int> b) {
return a.se * b.fi > b.se * a.fi;
}
signed main() {
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> n >> w;
for(int i = 0; i < n; i++) {
cin >> arr[i].fi.fi >> arr[i].fi.se;
arr[i].se = i + 1;
}
sort(arr, arr + n, cmp);
priority_queue<pair<int, int>> in;
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> out;
int sum = 0;
int ans = 0;
int ls = -1;
pair<int, int> mc = mp(1000000000, 1);
for(int i = 0; i < n; i++) {
in.push(mp(arr[i].fi.se, arr[i].se));
sum += arr[i].fi.se;
int a = w * arr[i].fi.se / arr[i].fi.fi;
while(sum > a) {
sum -= in.top().fi;
out.push(in.top());
in.pop();
}
while(!out.empty() && sum + out.top().fi <= a) {
sum += out.top().fi;
in.push(out.top());
out.pop();
}
if(in.size() > ans) {
ls = i;
mc = mp(sum * arr[i].fi.fi, arr[i].fi.se);
}
else if(in.size() == ans && le(mp(sum * arr[i].fi.fi, arr[i].fi.se), mc)) {
ls = i;
mc = mp(sum * arr[i].fi.fi, arr[i].fi.se);
}
ans = max(ans, (int)in.size());
}
cout << ans << '\n';
while(!in.empty()) in.pop();
while(!out.empty()) out.pop();
sum = 0;
for(int i = 0; i <= ls; i++) {
in.push(mp(arr[i].fi.se, arr[i].se));
sum += arr[i].fi.se;
int a = w * arr[i].fi.se / arr[i].fi.fi;
while(sum > a) {
sum -= in.top().fi;
out.push(in.top());
in.pop();
}
while(!out.empty() && sum + out.top().fi <= a) {
sum += out.top().fi;
in.push(out.top());
out.pop();
}
}
while(!in.empty()) {
cout << in.top().se << '\n';
in.pop();
}
return 0;
}
Compilation message (stderr)
hiring.cpp: In function 'int main()':
hiring.cpp:47:22: warning: comparison of integer expressions of different signedness: 'std::priority_queue<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} and 'long long int' [-Wsign-compare]
47 | if(in.size() > ans) {
| ~~~~~~~~~~^~~~~
hiring.cpp:51:27: warning: comparison of integer expressions of different signedness: 'std::priority_queue<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} and 'long long int' [-Wsign-compare]
51 | else if(in.size() == ans && le(mp(sum * arr[i].fi.fi, arr[i].fi.se), mc)) {
| ~~~~~~~~~~^~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |