Submission #1247742

#TimeUsernameProblemLanguageResultExecution timeMemory
1247742makmed1337Seats (IOI18_seats)C++20
25 / 100
4098 ms86836 KiB
#include "seats.h" #include <algorithm> #include <bits/stdc++.h> #include <vector> using namespace std; constexpr int inf = 1e9; struct Tree { struct T { int mn = inf, mx = -inf; static T from(int x) { return {x, x}; } T static combine(T f, T s) { return {min(f.mn, s.mn), max(f.mx, s.mx)}; } }; vector<T> tree; void pull(int i) { tree[i] = T::combine(tree[2 * i], tree[2 * i + 1]); } void init(vector<int> const &base) { int n = base.size(); tree.resize(4 * n); _build(1, 0, n - 1, base); } void _build(int i, int l, int r, vector<int> const &base) { if (l == r) { tree[i] = T::from(base[l]); return; } int m = (l + r) / 2; _build(2 * i, l, m, base); _build(2 * i + 1, m + 1, r, base); pull(i); } T get(int i, int l, int r, int lb, int rb) const { if (r < lb || l > rb) { return {}; } if (lb <= l && r <= rb) { return tree[i]; } int m = (l + r) / 2; return T::combine(get(2 * i, l, m, lb, rb), get(2 * i + 1, m + 1, r, lb, rb)); } void update(int i, int l, int r, int pos, int x) { if (pos < l || pos > r) { return; } if (l == r) { tree[i] = T::from(x); return; } int m = (l + r) / 2; update(2 * i, l, m, pos, x); update(2 * i + 1, m + 1, r, pos, x); pull(i); } }; vector<int> r, c; Tree rt, ct; int n; void give_initial_chart(int H, int W, std::vector<int> R, std::vector<int> C) { n = H * W; r = R; c = C; rt.init(r); ct.init(c); } int swap_seats(int a, int b) { swap(r[a], r[b]); rt.update(1, 0, n - 1, a, r[a]); rt.update(1, 0, n - 1, b, r[b]); swap(c[a], c[b]); ct.update(1, 0, n - 1, a, c[a]); ct.update(1, 0, n - 1, b, c[b]); int res = 0; int i = 0; while (i < n) { auto rr = rt.get(1, 0, n - 1, 0, i); auto cc = ct.get(1, 0, n - 1, 0, i); int sz = (rr.mx - rr.mn + 1) * (cc.mx - cc.mn + 1); if (sz == i + 1) { res++; ++i; } else { i = sz - 1; } } return res; }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...