이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#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 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... |