Submission #585055

#TimeUsernameProblemLanguageResultExecution timeMemory
585055Drew_Robots (IOI13_robots)C++17
14 / 100
1051 ms19112 KiB
#include "robots.h" #include <bits/stdc++.h> using namespace std; #define pb push_back #define f1 first #define s2 second using ii = pair<int, int>; const int MAX = 5e4 + 69; int bit[MAX]; inline void add(int x, int val) { for (++x; x < MAX; x += (x & -x)) bit[x] += val; } inline int sum(int x) { int res = 0; for (++x; x > 0; x -= (x & -x)) res += bit[x]; return res; } int putaway(int A, int B, int T, int X[], int Y[], int W[], int S[]) { { vector<int> comp; for (int i = 0; i < A; ++i) comp.pb(X[i]); for (int i = 0; i < T; ++i) comp.pb(W[i]); sort(comp.begin(), comp.end()); comp.resize(unique(comp.begin(), comp.end()) - comp.begin()); for (int i = 0; i < A; ++i) X[i] = 1 + (int)(lower_bound(comp.begin(), comp.end(), X[i]) - comp.begin()); for (int i = 0; i < T; ++i) W[i] = 1 + (int)(lower_bound(comp.begin(), comp.end(), W[i]) - comp.begin()); } { vector<int> comp; for (int i = 0; i < B; ++i) comp.pb(Y[i]); for (int i = 0; i < T; ++i) comp.pb(S[i]); sort(comp.begin(), comp.end()); comp.resize(unique(comp.begin(), comp.end()) - comp.begin()); for (int i = 0; i < B; ++i) Y[i] = 1 + (int)(lower_bound(comp.begin(), comp.end(), Y[i]) - comp.begin()); for (int i = 0; i < T; ++i) S[i] = 1 + (int)(lower_bound(comp.begin(), comp.end(), S[i]) - comp.begin()); } sort(X, X+A); sort(Y, Y+B); for (int i = 0; i < T; ++i) { if ((A == 0 || X[A-1] <= W[i]) && (B == 0 || Y[B-1] <= S[i])) return -1; } vector<ii> vec; for (int i = 0; i < T; ++i) vec.pb({S[i], W[i]}); sort(vec.rbegin(), vec.rend()); const auto check = [&](int val) -> bool { memset(bit, 0, sizeof(bit)); vector<int> v; for (int i = 0; i < T; ++i) { int id = (int)(upper_bound(X, X+A, vec[i].s2) - X); if (sum(A) - sum(id-1) < 1ll * (A-id) * val) add(id, 1); else v.pb(vec[i].f1); // cerr << vec[i].s2 << " " << id << '\n'; } memset(bit, 0, sizeof(bit)); for (int x : v) { int id = (int)(upper_bound(Y, Y+B, x) - Y); if (sum(B) - sum(id-1) < 1ll * (B-id) * val) add(id, 1); else return false; } return true; }; int l = 1, r = 1e6; while (l < r) { int mid = (l + r) >> 1; if (check(mid)) r = mid; else l = mid + 1; } return l; }
#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...