Submission #521236

#TimeUsernameProblemLanguageResultExecution timeMemory
521236Alex_tz307Robots (IOI13_robots)C++17
76 / 100
3068 ms28916 KiB
#include <bits/stdc++.h>
#include "robots.h"

using namespace std;

int putaway(int A, int B, int T, int X[], int Y[], int W[], int S[]) {
  sort(X, X + A);
  sort(Y, Y + B);
  vector<tuple<int, int, int>> toys(T);
  for (int i = 0; i < T; ++i) {
    toys[i] = make_tuple(W[i], S[i], i);
  }
  auto check = [&](const int &m) -> int {
    sort(toys.begin(), toys.end());
    vector<bool> taken(T);
    priority_queue<pair<int, int>> pq;
    int p = 0;
    for (int i = 0; i < A; ++i) {
      while (p < T && get<0>(toys[p]) < X[i]) {
        pq.emplace(get<1>(toys[p]), get<2>(toys[p]));
        p += 1;
      }
      int cnt = 0;
      while (!pq.empty() && cnt < m) {
        taken[pq.top().second] = true;
        cnt += 1;
        pq.pop();
      }
    }
    sort(toys.begin(), toys.end(), [&](const tuple<int, int, int> &x, const tuple<int, int, int> &y) {
      return get<1>(x) < get<1>(y);
    });
    p = 0;
    queue<int> q;
    for (int i = 0; i < B; ++i) {
      while (p < T && get<1>(toys[p]) < Y[i]) {
        if (!taken[get<2>(toys[p])]) {
          q.emplace(get<2>(toys[p]));
        }
        p += 1;
      }
      int cnt = 0;
      while (!q.empty() && cnt < m) {
        taken[q.front()] = true;
        cnt += 1;
        q.pop();
      }
    }
    for (int i = 0; i < T; ++i) {
      if (!taken[i]) {
        return false;
      }
    }
    return true;
  };
  int l = 1, r = T, ans = -1;
  while (l <= r) {
    int mid = (l + r) / 2;
    if (check(mid)) {
      ans = mid;
      r = mid - 1;
    } else {
      l = mid + 1;
    }
  }
  return ans;
}
#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...