# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
257729 | 2020-08-04T16:08:00 Z | Bruteforceman | 청소 (JOI20_sweeping) | C++11 | 16197 ms | 326468 KB |
#include <bits/stdc++.h> using namespace std; const int maxm = 1.5e6 + 10; int X[maxm], Y[maxm]; pair <int, int> ans[maxm]; int n; struct info { int t, p; int idx; info () {} }; info index(int i) { info x; x.t = 4; x.idx = i; return x; } struct ds { int par[maxm], value[maxm]; vector <int> cont[maxm]; priority_queue <pair <int, int>, vector <pair <int, int>>, greater <pair <int, int>>> Q; void init() { while(!Q.empty()) Q.pop(); } int root(int x) { if(par[x] == x) return x; return par[x] = root(par[x]); } void joinIdx(int x, int y) { x = root(x); y = root(y); if(x != y) { if(cont[x].size() > cont[y].size()) swap(x, y); par[x] = y; for(auto i : cont[x]) { cont[y].push_back(i); } } } void add(int pos, int idx) { Q.emplace(pos, idx); par[idx] = idx; value[idx] = pos; cont[idx] = vector <int> ({idx}) ; } int getPos(int idx) { return value[root(idx)]; } vector <int> getIndex(int pos) { vector <int> ans; while(!Q.empty()) { int x = Q.top().first; int idx = Q.top().second; if(x <= pos) { Q.pop(); for(int i : cont[idx]) { ans.push_back(i); } } else break; } return ans; } void move(int pos) { int last = -1; while(!Q.empty()) { int x = Q.top().first; int idx = Q.top().second; if(x <= pos) { Q.pop(); if(last != -1) joinIdx(last, idx); last = idx; } else break; } if(last != -1) { value[root(last)] = pos; Q.emplace(pos, root(last)); } } } contX, contY; void solve(int xa, int ya, vector <info> &v) { if(v.empty()) return ; int midX = (xa + n - ya) / 2; int midY = n - midX; vector <info> left, right; map <int, int> side; contX.init(); contY.init(); for(auto i : v) { if(i.t == 1) { if(side.find(i.p) == side.end()) { ans[i.idx] = make_pair(contX.getPos(i.p), contY.getPos(i.p)); } else { if(side[i.p]) right.push_back(i); else left.push_back(i); } } else if (i.t == 2) { if(i.p < midY) { auto u = contY.getIndex(i.p); for(auto j : u) { if(side.find(j) != side.end()) continue; X[j] = n - i.p; Y[j] = contY.getPos(j); right.push_back(index(j)); side[j] = 1; } right.push_back(i); } else { contX.move(n - i.p); left.push_back(i); } } else if (i.t == 3) { if(i.p < midX) { auto u = contX.getIndex(i.p); for(auto j : u) { if(side.find(j) != side.end()) continue; X[j] = contX.getPos(j); Y[j] = n - i.p; left.push_back(index(j)); side[j] = 0; } left.push_back(i); } else { contY.move(n - i.p); right.push_back(i); } } else { if(X[i.idx] <= midX && Y[i.idx] <= midY) { contX.add(X[i.idx], i.idx); contY.add(Y[i.idx], i.idx); } else if (midX < X[i.idx]) { side[i.idx] = 1; right.push_back(i); } else { side[i.idx] = 0; left.push_back(i); } } } v.clear(); side.clear(); if(ya <= midY + 1 && midY + 1 <= n - xa) { solve(xa, midY + 1, left); } if(xa <= midX + 1 && midX + 1 <= n - ya) { solve(midX + 1, ya, right); } } int main() { int m, q; scanf("%d %d %d", &n, &m, &q); vector <info> v; for(int i = 1; i <= m; i++) { info add; add.t = 4; add.idx = i; scanf("%d %d", &X[i], &Y[i]); v.push_back(add); } for(int i = 1; i <= q; i++) { info add; scanf("%d", &add.t); if(add.t == 1) { scanf("%d", &add.p); add.idx = i; } else if (add.t == 2) scanf("%d", &add.p); else if (add.t == 3) scanf("%d", &add.p); else { add.idx = ++m; scanf("%d %d", &X[m], &Y[m]); } v.push_back(add); } auto u = v; solve(0, 0, u); for(auto i : v) { if(i.t == 1) printf("%d %d\n", ans[i.idx].first, ans[i.idx].second); } return 0; }
Compilation message
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 68 ms | 71672 KB | Output is correct |
2 | Correct | 54 ms | 71296 KB | Output is correct |
3 | Correct | 48 ms | 71552 KB | Output is correct |
4 | Correct | 60 ms | 71772 KB | Output is correct |
5 | Correct | 58 ms | 71800 KB | Output is correct |
6 | Correct | 49 ms | 71544 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 8309 ms | 207600 KB | Output is correct |
2 | Correct | 8170 ms | 207464 KB | Output is correct |
3 | Correct | 8256 ms | 217372 KB | Output is correct |
4 | Correct | 9831 ms | 251048 KB | Output is correct |
5 | Correct | 12885 ms | 227808 KB | Output is correct |
6 | Correct | 12829 ms | 252712 KB | Output is correct |
7 | Correct | 8029 ms | 238564 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 6193 ms | 207112 KB | Output is correct |
2 | Correct | 6783 ms | 211208 KB | Output is correct |
3 | Correct | 5487 ms | 231888 KB | Output is correct |
4 | Correct | 5844 ms | 253576 KB | Output is correct |
5 | Correct | 7227 ms | 258804 KB | Output is correct |
6 | Correct | 6380 ms | 232364 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 6193 ms | 207112 KB | Output is correct |
2 | Correct | 6783 ms | 211208 KB | Output is correct |
3 | Correct | 5487 ms | 231888 KB | Output is correct |
4 | Correct | 5844 ms | 253576 KB | Output is correct |
5 | Correct | 7227 ms | 258804 KB | Output is correct |
6 | Correct | 6380 ms | 232364 KB | Output is correct |
7 | Correct | 7769 ms | 223712 KB | Output is correct |
8 | Correct | 7840 ms | 221864 KB | Output is correct |
9 | Correct | 7734 ms | 222892 KB | Output is correct |
10 | Correct | 9909 ms | 244080 KB | Output is correct |
11 | Correct | 11396 ms | 271932 KB | Output is correct |
12 | Correct | 14529 ms | 253664 KB | Output is correct |
13 | Correct | 13723 ms | 305760 KB | Output is correct |
14 | Correct | 302 ms | 128432 KB | Output is correct |
15 | Correct | 2734 ms | 204972 KB | Output is correct |
16 | Correct | 7436 ms | 222764 KB | Output is correct |
17 | Correct | 7660 ms | 222104 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 68 ms | 71672 KB | Output is correct |
2 | Correct | 54 ms | 71296 KB | Output is correct |
3 | Correct | 48 ms | 71552 KB | Output is correct |
4 | Correct | 60 ms | 71772 KB | Output is correct |
5 | Correct | 58 ms | 71800 KB | Output is correct |
6 | Correct | 49 ms | 71544 KB | Output is correct |
7 | Correct | 8309 ms | 207600 KB | Output is correct |
8 | Correct | 8170 ms | 207464 KB | Output is correct |
9 | Correct | 8256 ms | 217372 KB | Output is correct |
10 | Correct | 9831 ms | 251048 KB | Output is correct |
11 | Correct | 12885 ms | 227808 KB | Output is correct |
12 | Correct | 12829 ms | 252712 KB | Output is correct |
13 | Correct | 8029 ms | 238564 KB | Output is correct |
14 | Correct | 6193 ms | 207112 KB | Output is correct |
15 | Correct | 6783 ms | 211208 KB | Output is correct |
16 | Correct | 5487 ms | 231888 KB | Output is correct |
17 | Correct | 5844 ms | 253576 KB | Output is correct |
18 | Correct | 7227 ms | 258804 KB | Output is correct |
19 | Correct | 6380 ms | 232364 KB | Output is correct |
20 | Correct | 7769 ms | 223712 KB | Output is correct |
21 | Correct | 7840 ms | 221864 KB | Output is correct |
22 | Correct | 7734 ms | 222892 KB | Output is correct |
23 | Correct | 9909 ms | 244080 KB | Output is correct |
24 | Correct | 11396 ms | 271932 KB | Output is correct |
25 | Correct | 14529 ms | 253664 KB | Output is correct |
26 | Correct | 13723 ms | 305760 KB | Output is correct |
27 | Correct | 302 ms | 128432 KB | Output is correct |
28 | Correct | 2734 ms | 204972 KB | Output is correct |
29 | Correct | 7436 ms | 222764 KB | Output is correct |
30 | Correct | 7660 ms | 222104 KB | Output is correct |
31 | Correct | 8619 ms | 243260 KB | Output is correct |
32 | Correct | 8525 ms | 228776 KB | Output is correct |
33 | Correct | 6640 ms | 234028 KB | Output is correct |
34 | Correct | 8989 ms | 261292 KB | Output is correct |
35 | Correct | 8807 ms | 261176 KB | Output is correct |
36 | Correct | 11338 ms | 253988 KB | Output is correct |
37 | Correct | 14080 ms | 312492 KB | Output is correct |
38 | Correct | 16197 ms | 326468 KB | Output is correct |
39 | Correct | 13268 ms | 300988 KB | Output is correct |
40 | Correct | 8406 ms | 248188 KB | Output is correct |