제출 #107226

#제출 시각아이디문제언어결과실행 시간메모리
107226nickyrio로봇 (IOI13_robots)C++17
100 / 100
1914 ms24380 KiB
#include "robots.h" #include <bits/stdc++.h> using namespace std; bool canPut(int TIME, int A, int B, int T, vector< vector<int> >& WeakRobot, int Y[], int S[]) { priority_queue<int> maxSize; for (int i = 0; i < A; ++i) { int sz = WeakRobot[i].size(); if (TIME < sz) { for (int j = TIME; j < sz; ++j) { maxSize.push(S[WeakRobot[i][j]]); // cerr << "+ " << S[WeakRobot[i][j]] << endl; } } else { while (sz < TIME && !maxSize.empty()) { ++sz; // cerr << "- " << maxSize.top() << endl; maxSize.pop(); } } } for (int val : WeakRobot[A]) maxSize.push(S[val]); int i = B - 1, sz = maxSize.size(); while (i >= 0 && sz) { // cerr << i << ' ' << sz << endl; int j = min(sz, TIME); // cerr << "Small Robot " << i << endl; sz -= j; while (j--) { // cerr << maxSize.top() << ' '; if (maxSize.top() > Y[i]) return false; maxSize.pop(); } // cerr << endl; --i; } return (sz == 0); } 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< vector<int> > WeakRobot(A + 1); for (int i = 0; i < T; ++i) { ++W[i], ++S[i]; int idW = lower_bound(X, X + A, W[i]) - X; WeakRobot[idW].push_back(i); } for (int i = 0; i < A; ++i) { sort(WeakRobot[i].begin(), WeakRobot[i].end(), [&](int x, int y) { return S[x] > S[y]; }); } /* for (int i = 0; i <= A; ++i) { cerr << "WeakRobot " << i << endl; for (int val : WeakRobot[i]) cerr << S[val] << ' '; cerr << endl; } */ int l = 1, r = T; int ans = -1; while (l <= r) { int m = (l + r) >> 1; if (canPut(m, A, B, T, WeakRobot, Y, S)) { ans = m; r = m - 1; } else l = m + 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...