Submission #970967

#TimeUsernameProblemLanguageResultExecution timeMemory
970967aZvezdaHiring (IOI09_hiring)C++14
100 / 100
271 ms26600 KiB
#include <bits/stdc++.h>
using namespace std;

#ifndef LOCAL
#define cerr if (false) cerr
#endif
#define endl "\n"

template<class T, class T2> inline bool chkmax(T &x, const T2 &y) { return x < y ? x = y, 1 : 0; }
template<class T, class T2> inline bool chkmin(T &x, const T2 &y) { return x > y ? x = y, 1 : 0; }

typedef long long ll;
const ll mod = 1e9 + 7;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//

const ll MAX_N  = 5e5 + 10;
std::pair<std::pair<ll, ll>, ll> arr[MAX_N];
ll n, w;

signed main() {
#ifndef LOCAL
	ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
#endif
	cin >> n >> w;
	for (ll i = 0; i < n; i ++) {
		cin >> arr[i].first.first >> arr[i].first.second;
		arr[i].second = i;
	}

	std::sort(arr, arr + n, [](const auto &x, const auto &y) {
		if (x.first.first * y.first.second == x.first.second * y.first.first) {
			return x.first.second < y.first.second;
		}
		return x.first.first * y.first.second < x.first.second * y.first.first;
	});

	ll best = 0;
	long double best2 = 1e18;
	ll best_ind = -1;

	{
		std::priority_queue<std::pair<ll, ll> > pq = {};
		ll sum = 0;
		for (ll i = 0; i < n; i ++) {
			sum += arr[i].first.second;
			pq.push({arr[i].first.second, i});
			if (i != n - 1 && (arr[i].first.first * arr[i + 1].first.second == arr[i].first.second * arr[i + 1].first.first)) {
				continue;
			}
			while (sum * arr[i].first.first > w * arr[i].first.second) {
				sum -= pq.top().first;
				pq.pop();
			}
			long double curr = (long double)sum / arr[i].first.second * (long double)arr[i].first.first;
			if (pq.size() > best) {
				best = pq.size();
				best_ind = i;
				best2 = curr;
			} else if(pq.size() == best) {
				if (best2 > curr) {
					best2 = curr;
					best_ind = i;
				}
			}
		}
	}

	{
		std::priority_queue<std::pair<ll, ll> > pq = {};
		ll sum = 0;
		for (ll i = 0; i <= best_ind; i ++) {
			sum += arr[i].first.second;
			pq.push({arr[i].first.second, arr[i].second});
		}

		while (sum * arr[best_ind].first.first > w * arr[best_ind].first.second) {
			sum -= pq.top().first;
			pq.pop();
		}

		std::cout << pq.size() << endl;
		std::vector<ll> ret = {};
		while(!pq.empty()) {
			ret.push_back(pq.top().second + 1);
			pq.pop();
		}
		std::sort(ret.begin(), ret.end());
		for (const auto it : ret) {
			std::cout << it << endl;
		}
	}

	return 0;
}

Compilation message (stderr)

hiring.cpp: In function 'int main()':
hiring.cpp:55:18: 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 'll' {aka 'long long int'} [-Wsign-compare]
   55 |    if (pq.size() > best) {
      |        ~~~~~~~~~~^~~~~~
hiring.cpp:59:24: 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 'll' {aka 'long long int'} [-Wsign-compare]
   59 |    } else if(pq.size() == best) {
      |              ~~~~~~~~~~^~~~~~~
#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...