제출 #185477

#제출 시각아이디문제언어결과실행 시간메모리
185477FieryPhoenixRobots (IOI13_robots)C++11
76 / 100
3093 ms24372 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <map>
#include <queue>
#include <set>
#include <iomanip>
#include <deque>
#include <cassert>
#include <ctime>
#include <cstring>
#include <cstdlib>
#include <chrono>
#include <ctime>
#include <random>
#include <stack>
#include <unordered_set>
#include <unordered_map>
#include <iterator>
#include <climits>
#include "robots.h"
using namespace std;

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
typedef long long ll;
typedef long double ld;
#define INF 2001001001
#define MOD 1000000007

struct toy{
  int w,s;
  toy(int a, int b){
    w=a; s=b;
  }
};

bool cmpW(toy a, toy b){
  return a.w<b.w;
}

bool cmpS(toy a, toy b){
  return a.s<b.s;
}

vector<toy>v;
bool taken[1000001],taken2[1000001];

int TIME=3;

bool check(int A, int B, int T, int X[], int Y[], int W[], int S[], int t){
  v.clear();
  for (int i=0;i<T;i++){
    taken[i]=false;
    taken2[i]=false;
    v.push_back(toy(W[i],S[i]));
  }
  sort(v.begin(),v.end(),cmpS);
  for (int i=0;i<B;i++){
    vector<pair<int,int>>v2;
    for (int j=0;j<(int)v.size();j++){
      if (v[j].s>=Y[i])
	break;
      if (taken[j])
	continue;
      v2.push_back({-v[j].w,j});
    }
    sort(v2.begin(),v2.end());
    for (int j=0;j<min((int)v2.size(),t);j++)
      taken[v2[j].second]=true;
  }
  vector<int>vW;
  for (int i=0;i<T;i++)
    if (!taken[i])
      vW.push_back(v[i].w);
  sort(vW.begin(),vW.end());
  for (int i=0;i<A;i++){
    int left=t;
    for (int j=0;j<(int)vW.size();j++){
      if (vW[j]>=X[i])
	break;
      if (taken2[j])
	continue;
      taken2[j]=true;
      left--;
      if (left==0)
	break;
    }
  }
  for (int i=0;i<(int)vW.size();i++)
    if (!taken2[i])
      return false;
  return true;
}
	  
int putaway(int A, int B, int T, int X[], int Y[], int W[], int S[]){
  sort(X,X+A);
  sort(Y,Y+B);
  int low=0,high=T+1,mid;
  while (low+1<high){
    mid=(low+high)/2;
    if (check(A,B,T,X,Y,W,S,mid))
      high=mid;
    else
      low=mid;
  }
  if (high==T+1)
    return -1;
  else
    return high;
}
#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...