Submission #405434

#TimeUsernameProblemLanguageResultExecution timeMemory
405434JasiekstrzHiring (IOI09_hiring)C++17
84 / 100
1589 ms14644 KiB
#include<bits/stdc++.h>
#define fi first
#define se second
using namespace std;
const int N=5e5;
struct Worker
{
	long long s,q;
	int id;
	Worker(long long _s=0,long long _q=1,int _id=0) : s(_s), q(_q), id(_id) {};
	bool operator<(const Worker &oth) const
	{
		return s*oth.q<oth.s*q;
	}
	bool operator<=(const Worker &oth) const
	{
		return s*oth.q<=oth.s*q;
	}
};
Worker tab[N+10];
priority_queue<pair<int,int>> us;
Worker solve(int n,long long w,int mid,Worker brk)
{
	while(!us.empty())
		us.pop();
	Worker mn={w+1,1};
	long long sum=0;
	for(int i=1;i<=n;i++)
	{
		if(us.size()==mid-1)
			mn=min(mn,Worker((sum+tab[i].q)*tab[i].s,tab[i].q));
		if(mn.s*brk.q==mn.q*brk.s)
		{
			us.push({tab[i].q,tab[i].id});
			return mn;
		}
		if(us.size()<mid-1)
		{
			sum+=tab[i].q;
			us.push({tab[i].q,tab[i].id});
		}
		else if(mid>1 && tab[i].q<us.top().fi)
		{
			sum+=tab[i].q-us.top().fi;
			us.pop();
			us.push({tab[i].q,tab[i].id});
		}
	}
	return mn;
}
int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	int n;
	long long w;
	cin>>n>>w;
	for(int i=1;i<=n;i++)
	{
		cin>>tab[i].s>>tab[i].q;
		tab[i].id=i;
	}
	sort(tab+1,tab+n+1);
	int bg=0,en=n;
	while(bg<en)
	{
		int mid=(bg+en+1)/2;
		if(solve(n,w,mid,Worker(-1,1))<=Worker(w,1))
			bg=mid;
		else
			en=mid-1;
	}
	cout<<bg<<"\n";
	solve(n,w,bg,solve(n,w,bg,Worker(-1,1)));
	while(!us.empty())
	{
		cout<<us.top().se<<"\n";
		us.pop();
	}
	return 0;
}

Compilation message (stderr)

hiring.cpp: In function 'Worker solve(int, long long int, int, Worker)':
hiring.cpp:30:15: warning: comparison of integer expressions of different signedness: 'std::priority_queue<std::pair<int, int> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   30 |   if(us.size()==mid-1)
      |      ~~~~~~~~~^~~~~~~
hiring.cpp:37:15: warning: comparison of integer expressions of different signedness: 'std::priority_queue<std::pair<int, int> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   37 |   if(us.size()<mid-1)
      |      ~~~~~~~~~^~~~~~
#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...