Submission #386626

#TimeUsernameProblemLanguageResultExecution timeMemory
386626talant117408Robots (IOI13_robots)C++17
53 / 100
778 ms39136 KiB
#include "robots.h"
//~ #include "grader.cpp"
#include <bits/stdc++.h>
 
using namespace std;
 
typedef long long ll;
typedef pair <int, int> pii;
typedef pair <ll, ll> pll;
 
#define precision(n) fixed << setprecision(n)
#define pb push_back
#define ub upper_bound
#define lb lower_bound
#define mp make_pair
#define eps (double)1e-9
#define PI 2*acos(0.0)
#define endl "\n"
#define sz(v) int((v).size())
#define all(v) v.begin(),v.end()
#define rall(v) v.rbegin(),v.rend()
#define do_not_disturb ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define OK cout << "OK" << endl;

const int N = 50003;
int n, m;
vector <int> weak, small;

int putaway(int A, int B, int T, int X[], int Y[], int W[], int S[]) {
	n = A; m = B;
	for (int i = 0; i < n; i++) weak.pb(X[i]);
	for (int i = 0; i < m; i++) small.pb(Y[i]);
	sort(all(weak));
	sort(all(small));
	
	if (m == 0) {
		if (*max_element(W, W+T) >= weak[n-1]) {
			return -1;
		}
		multiset <int> st;
		for (int i = 0; i < T; i++) {
			st.insert(W[i]);
		}
		int elapsed = 0;
		while (sz(st)) {
			for (int i = n-1; i >= 0; i--) {
				auto it = st.lb(weak[i]);
				if (it == st.begin()) break;
				it--;
				st.erase(it);
			}
			elapsed++;
		}
		return elapsed;
	}
	
	set <int> ws, ss;
	map <int, vector <int>> for_W, for_S;
	multiset <int> Ws, Ss;
	for (int i = 0; i < T; i++) {
		for_W[W[i]].pb(S[i]);
		for_S[S[i]].pb(W[i]);
		ws.insert(W[i]); Ws.insert(W[i]);
		ss.insert(S[i]); Ss.insert(S[i]);
	}
	
	for (auto to : ws) {
		sort(all(for_W[to]));
	}
	for (auto to : ss) {
		sort(all(for_S[to]));
	}
	
	int elapsed = 0;
	while (sz(Ws) || sz(Ss)) {
		int removed = 0;	
		cout << endl; 
		for (int i = n-1; i >= 0; i--) {
			auto itsW = Ws.lb(weak[i]);
			if (sz(Ws) == 0 || itsW == Ws.begin()) break;
			itsW--;
			auto itsS = for_W[*itsW].back();
			for_W[*itsW].pop_back();
			Ws.erase(Ws.find(*itsW));
			Ss.erase(Ss.find(itsS));
			removed++;
		}
		for (int i = m-1; i >= 0; i--) {
			auto itsS = Ss.lb(small[i]);
			if (sz(Ss) == 0 || itsS == Ss.begin()) break;
			itsS--;
			auto itsW = for_S[*itsS].back();
			for_S[*itsS].pop_back();
			Ss.erase(Ss.find(*itsS));
			Ws.erase(Ws.find(itsW));
			removed++;
		}
		if (removed == 0) return -1;
		elapsed++;
	}
	return elapsed;
}
#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...