Submission #125415

#TimeUsernameProblemLanguageResultExecution timeMemory
125415MoNsTeR_CuBeRobots (IOI13_robots)C++17
90 / 100
664 ms65540 KiB
#include "robots.h"
#include <bits/stdc++.h>

using namespace std;

bool comp(vector< int > &A, vector< int > &B){
	return A.size() < B.size();
}

vector< int > used;

bool comp1(int a, int b){
	return used[a] < used[b];
}

int putaway(int A, int B, int T, int X[], int Y[], int W[], int S[]) {
    
    if(B == 0){
		sort(X,X+A);
		sort(W,W+T);
		
		for(int i = 0; i < T; i++){
			if(W[i] >= X[A-1]) return -1;
		}
		
		int left = 1, right = T;
		
		while(left < right){
			
			int mid = (left+right)/2;
			
			int curr = 0;
			
			for(int i = 0; i < A; i++){
				int index = min((long)curr + mid, lower_bound(W+curr, W+T, X[i])-W);
			
				curr = index;
			}
			
			if(curr >= T){
				right = mid;
			}else{
				left = mid+1;
			}
		}
		
		return right;
	}
    
    vector< int > taken(T, false);
    
    vector< vector< int > > canTake(A+B);
    
    used.assign(T,0);
    
    for(int i = 0; i < A; i++){
		for(int j = 0; j < T; j++){
			if(W[j] < X[i]){
				canTake[i].push_back(j);
				used[j]++;
			} 
		}
	}
	
	for(int i = 0; i < B; i++){
		for(int j = 0; j < T; j++){
			if(S[j] < Y[i]){
				canTake[A+i].push_back(j);
				used[j]++;
			} 
		}
	}
	
	for(int i = 0; i < T; i++){
		if(used[i] <= 0){
			return -1;
		}
	}
    
    sort(canTake.begin(), canTake.end(), comp);
    
    for(int i = 0; i < A+B; i++){
		sort(canTake[i].begin(), canTake[i].end(),comp1);
	}
    
    int left = 1, right = T;
    
    while(left < right){
		int mid = (left+right)/2;
		
		for(int i = 0; i < A+B; i++){
			int tot = 0;
			
			for(int a : canTake[i]){
				if(taken[a]) continue;
				if(tot >= mid) break;
				tot ++;
				taken[a] = true;
			}
		}
		
		bool verif = true;
		
		for(int i = 0; i < T; i++){
			if(!taken[i]) verif = false;
		}
		
		if(!verif){
			left = mid+1;
		}else{
			right = mid;
		}
		
		fill(taken.begin(), taken.end(), false);
	}
    
    return right;
}
#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...