Submission #388069

#TimeUsernameProblemLanguageResultExecution timeMemory
388069timmyfeng청소 (JOI20_sweeping)C++17
0 / 100
253 ms20396 KiB
#include <bits/stdc++.h> using namespace std; const int N = 1000001; #include <bits/extc++.h> template <class T, class Comp = less<T>> using ordered_set = __gnu_pbds::tree< T, __gnu_pbds::null_type, Comp, __gnu_pbds::rb_tree_tag, __gnu_pbds::tree_order_statistics_node_update >; int head[2][N], tail[2][N], prv[2][N], nxt[2][N]; int x_min[N], y_min[N], group[N], indices[N]; array<int, 2> point[N]; bool split(int i, int j, int l, int d) { bool flip = false; if (head[d][j] == 0) { head[d][i] = tail[d][i] = 0; } else { int h = head[d][j], t = tail[d][j]; while (point[h][d] <= l && point[t][d] > l) { h = nxt[d][h], t = prv[d][t]; } if (point[h][d] > l) { head[d][i] = h == head[d][j] ? 0 : head[d][j]; tail[d][i] = prv[d][h]; head[d][j] = h; nxt[d][prv[d][h]] = 0; prv[d][h] = 0; } else { flip = true; tail[d][i] = t == tail[d][j] ? 0 : tail[d][j]; head[d][i] = nxt[d][t]; tail[d][j] = t; prv[d][nxt[d][t]] = 0; nxt[d][t] = 0; } } d = 1 - d; int k = 0; for (int u = head[1 - d][i]; u != 0; u = nxt[1 - d][u]) { indices[k++] = u; group[u] = i; if (prv[d][u] == 0) { head[d][j] = nxt[d][u]; } if (nxt[d][u] == 0) { tail[d][j] = prv[d][u]; } nxt[d][prv[d][u]] = nxt[d][u]; prv[d][nxt[d][u]] = prv[d][u]; } if (k == 0) { head[d][i] = tail[d][i] = 0; } else { sort(indices, indices + k, [&](int u, int v) { return point[u][d] < point[v][d]; }); prv[d][indices[0]] = 0; head[d][i] = indices[0]; nxt[d][indices[k - 1]] = 0; tail[d][i] = indices[k - 1]; for (int i = 1; i < k; ++i) { nxt[d][indices[i - 1]] = indices[i]; prv[d][indices[i]] = indices[i - 1]; } } return flip; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int n, m, q; cin >> n >> m >> q; for (int i = 1; i <= m; ++i) { for (auto &j : point[i]) { cin >> j; } } iota(indices, indices + m, 1); for (int d = 0; d < 2; ++d) { sort(indices, indices + m, [&](int u, int v) { return point[u][d] < point[v][d]; }); for (int i = 1; i < n; ++i) { nxt[d][indices[i - 1]] = indices[i]; prv[d][indices[i]] = indices[i - 1]; } head[d][0] = indices[0]; tail[d][0] = indices[m - 1]; } map<int, int> triangles = {{0, 0}}; for (int i = 1; i <= q; ++i) { int type; cin >> type; if (type == 1) { int p; cin >> p; int j = group[p]; cout << max(x_min[j], point[p][0]) << " " << max(y_min[j], point[p][1]) << "\n"; } else if (type == 2) { int l; cin >> l; if (triangles.count(n - l) == 0) { int j = (--triangles.upper_bound(n - l))->second; x_min[i] = n - l, y_min[i] = y_min[j], y_min[j] = l + 1; triangles[n - l] = i; if (split(i, j, l, 1)) { swap(x_min[j], x_min[i]), swap(y_min[j], y_min[i]); swap(triangles[x_min[j]], triangles[x_min[i]]); } } } else if (type == 3) { int l; cin >> l; if (triangles.count(l + 1) == 0) { int j = (--triangles.upper_bound(l + 1))->second; y_min[i] = y_min[j], x_min[i] = l + 1, y_min[j] = n - l; triangles[l + 1] = i; if (!split(i, j, l, 0)) { swap(x_min[j], x_min[i]), swap(y_min[j], y_min[i]); swap(triangles[x_min[j]], triangles[x_min[i]]); } } } else if (type == 4) { int a, b; cin >> a >> b; assert(false); } } }
#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...