Submission #225247

#TimeUsernameProblemLanguageResultExecution timeMemory
225247DS007Robots (IOI13_robots)C++14
39 / 100
1214 ms65544 KiB
#include <bits/stdc++.h> #include "robots.h" using namespace std; #define lc(v) (v * 2) #define rc(v) (v * 2 + 1) #define mid (l + r) / 2 #define ff first #define ss second const int N = 1e6; class seg_tree { pair<int, int> t[N * 4]; void build(int v, int l, int r, pair<int, int> a[]) { if (l == r) { t[v] = {a[l].ss, a[l].ff}; return; } build(lc(v), l, mid, a); build(rc(v), mid + 1, r, a); t[v] = max(t[lc(v)], t[rc(v)]); } public: seg_tree(int n, pair<int, int> a[]) { build(1, 0, n - 1, a); } pair<int, int> query(int v, int l, int r, int tl, int tr) { if (tl > tr) return {-1, -1}; else if (l == tl && r == tr) return t[v]; return max(query(lc(v), l, mid, tl, min(mid, tr)), query(rc(v), mid + 1, r, max(tl, mid + 1), tr)); } void update(int v, int l, int r, int tl) { if (l == r && l == tl) { t[v] = {-1, -1}; return; } if (tl <= mid) update(lc(v), l, mid, tl); else update(rc(v), mid + 1, r, tl); t[v] = max(t[lc(v)], t[rc(v)]); } }; int putaway(int A, int B, int T, int X[], int Y[], int W[], int S[]) { pair<int, int> t1[T], t2[T]; multiset<int> x, y; for (int i = 0; i < T; i++) { t1[i] = {W[i], S[i]}; t2[i] = {S[i], W[i]}; x.insert(W[i]); y.insert(S[i]); } sort(t1, t1 + T); sort(t2, t2 + T); sort(X, X + A); sort(Y, Y + B); if ((t1[T - 1].ff >= X[A - 1] && t1[T - 1].ss >= Y[B - 1]) || (t2[T - 1].ff >= Y[B - 1] && t2[T - 1].ss >= X[A - 1])) return -1; multimap<pair<int, int>, int> m1, m2; for (int i = 0; i < T; i++) { m1.insert({t1[i], i}); m2.insert({t2[i], i}); } seg_tree st1(T, t1), st2(T, t2); int ans = 0, done = 0; while (done != T) { ans++; int p = upper_bound(X, X + A, *x.begin()) - X; while (p != A && done != T) { pair<int, int> q = st1.query(1, 0, T - 1, 0, lower_bound(t1, t1 + T, pair<int, int>{X[p] - 1, 1e9}) - t1 - 1); auto itr = m1.find({q.ss, q.ff}); st1.update(1, 0, T - 1, itr->ss); m1.erase(itr); itr = m2.find(q); st2.update(1, 0, T - 1, itr->ss); m2.erase(itr); x.erase(x.find(q.ss)); y.erase(y.find(q.ff)); done++; int p_ = upper_bound(X, X + A, *x.begin()) - X; p = max(p + 1, p_); } p = upper_bound(Y, Y + B, *y.begin()) - Y; while (p != B && done != T) { pair<int, int> q = st2.query(1, 0, T - 1, 0, lower_bound(t2, t2 + T, pair<int, int>{Y[p] - 1, 1e9}) - t2 - 1); auto itr = m2.find({q.ss, q.ff}); st2.update(1, 0, T - 1, itr->ss); m2.erase(itr); itr = m1.find(q); st1.update(1, 0, T - 1, itr->ss); m1.erase(itr); y.erase(y.find(q.ss)); x.erase(x.find(q.ff)); done++; int p_ = upper_bound(Y, Y + B, *y.begin()) - Y; p = max(p + 1, p_); } } 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...