Submission #997402

#TimeUsernameProblemLanguageResultExecution timeMemory
997402phoenixRobots (IOI13_robots)C++17
100 / 100
810 ms36828 KiB
#include "robots.h" #include <bits/stdc++.h> const int N = 100100; const int T = 1100100; const int INF = 1e9; using namespace std; class Heap { private: int arr[2 * T]; int sz; public: Heap() { sz = 0; for (int i = 1; i < T; i++) arr[i] = INF; } void init() { while (sz) { arr[sz--] = INF; } } void normalize(int v) { for (int i = v; i > 1 && arr[i] < arr[i / 2]; i /= 2) std::swap(arr[i], arr[i / 2]); } void push(int x) { arr[++sz] = x; normalize(sz); } int top() { return arr[1]; } void pop() { arr[1] = INF; int v = 1; while (std::min(arr[2 * v], arr[2 * v + 1]) != INF) { if (arr[2 * v] <= arr[2 * v + 1]) { std::swap(arr[2 * v], arr[v]); v = 2 * v; } else { std::swap(arr[2 * v + 1], arr[v]); v = 2 * v + 1; } } std::swap(arr[v], arr[sz]); sz--; normalize(v); } int size() { return sz; } }; int n, m, t; int X[T], Y[T]; int W[N], S[N]; vector<int> ord; Heap pq; bool check(int k) { pq.init(); int l = n - 1; vector<int> rest; for (int toy : ord) { while (l >= 0 && W[l] > X[toy]) l--; pq.push(Y[toy]); if (1ll * (n - 1 - l) * k < pq.size()) { rest.push_back(pq.top()); pq.pop(); } } // for (int c : rest) cout << c << ' '; // cout << '\n'; sort(rest.rbegin(), rest.rend()); l = m - 1; long long cnt = 0; for (int y : rest) { while (m >= 0 && S[l] > y) { cnt += k; l--; } cnt--; if (cnt < 0) { return 0; } } return 1; } int putaway(int A, int B, int T, int W_inside[], int S_inside[], int X_inside[], int Y_inside[]) { n = A, m = B, t = T; for (int i = 0; i < n; i++) W[i] = W_inside[i]; for (int i = 0; i < m; i++) S[i] = S_inside[i]; for (int i = 0; i < t; i++) { X[i] = X_inside[i]; Y[i] = Y_inside[i]; } sort(W, W + n); sort(S, S + m); ord.resize(t); iota(ord.begin(), ord.end(), 0); sort(ord.begin(), ord.end(), [&](int i, int j) { if (X[i] != X[j]) return X[i] > X[j]; return Y[i] > Y[j]; }); int l = 0, r = T + 1; while (r - l > 1) { int mid = (l + r) / 2; if (check(mid)) r = mid; else l = mid; } if (r == T + 1) return -1; 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...