Submission #426381

#TimeUsernameProblemLanguageResultExecution timeMemory
426381frodakcinRobots (IOI13_robots)C++17
100 / 100
1708 ms19380 KiB
#include "robots.h"
#include <cassert>
#include <algorithm>
#include <map>
#include <vector>
#include <numeric>
#include <functional>

int putaway(int A, int B, int T, int X[], int Y[], int W[], int S[])
{
	std::sort(X, X+A);
	std::sort(Y, Y+B);
	for(int i=0;i<T;++i)
		if((A==0||W[i]>=X[A-1]) && (B==0||S[i]>=Y[B-1]))
			return -1;

	for(int i=0;i<T;++i)
	{
		W[i] = A?std::lower_bound(X, X+A, W[i]+1)-X:0;
		assert(0 <= W[i] && W[i] <= A);
		S[i] = B?std::lower_bound(Y, Y+B, S[i]+1)-Y:0;
		assert(0 <= S[i] && S[i] <= B);
	}

	//must be possible;
	std::vector<int> ord(T);
	std::iota(ord.begin(), ord.end(), 0);
	std::sort(ord.begin(), ord.end(), [&](int u, int v){return W[u]<W[v];});

	int l=0, r=T;
	for(;r-l>1;)
	{
		int m=l+(r-l)/2;
		int j=0;
		std::map<int, int> map;
		for(int i=0;i<=A;++i)
		{
			for(;j < T && W[ord[j]] == i;++j)
				++map[S[ord[j]]];
			if(i<A)
				for(int rem=m;rem>0 && !map.empty();)
				{
					auto it=std::prev(map.end());
					if(rem >= it->second)
						rem -= it->second, map.erase(it);
					else
						it->second -= rem, rem=0;
				}
		}
		assert(j == T);

		int c=0;
		for(int i=0;i<=B;++i)
		{
			if(!map.empty() && map.begin()->first == i)
				c += map.begin()->second, map.erase(map.begin());
			if(i<B)
				c=std::max(c-m, 0);
		}
		if(c==0) // good
			r=m;
		else
			l=m;
	}
	return r;
}
#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...