답안 #882550

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
882550 2023-12-03T11:02:53 Z marvinthang 청소 (JOI20_sweeping) C++17
100 / 100
3776 ms 288976 KB
/*************************************
*    author: marvinthang             *
*    created: 03.12.2023 16:52:48    *
*************************************/

#include <bits/stdc++.h>

using namespace std;

#define                  fi  first
#define                  se  second
#define                left  ___left
#define               right  ___right
#define                TIME  (1.0 * clock() / CLOCKS_PER_SEC)
#define             MASK(i)  (1LL << (i))
#define           BIT(x, i)  ((x) >> (i) & 1)
#define  __builtin_popcount  __builtin_popcountll
#define              ALL(v)  (v).begin(), (v).end()
#define           REP(i, n)  for (int i = 0, _n = (n); i < _n; ++i)
#define          REPD(i, n)  for (int i = (n); i-- > 0; )
#define        FOR(i, a, b)  for (int i = (a), _b = (b); i < _b; ++i) 
#define       FORD(i, b, a)  for (int i = (b), _a = (a); --i >= _a; ) 
#define       FORE(i, a, b)  for (int i = (a), _b = (b); i <= _b; ++i) 
#define      FORDE(i, b, a)  for (int i = (b), _a = (a); i >= _a; --i) 
#define        scan_op(...)  istream & operator >> (istream &in, __VA_ARGS__ &u)
#define       print_op(...)  ostream & operator << (ostream &out, const __VA_ARGS__ &u)
#ifdef LOCAL
    #include "debug.h"
#else
    #define file(name) if (fopen(name".inp", "r")) { freopen(name".inp", "r", stdin); freopen(name".out", "w", stdout); }
    #define DB(...) 23
    #define db(...) 23
    #define debug(...) 23
#endif

template <class U, class V> scan_op(pair <U, V>)  { return in >> u.first >> u.second; }
template <class T> scan_op(vector <T>)  { for (size_t i = 0; i < u.size(); ++i) in >> u[i]; return in; }
template <class U, class V> print_op(pair <U, V>)  { return out << '(' << u.first << ", " << u.second << ')'; }
template <size_t i, class T> ostream & print_tuple_utils(ostream &out, const T &tup) { if constexpr(i == tuple_size<T>::value) return out << ")";  else return print_tuple_utils<i + 1, T>(out << (i ? ", " : "(") << get<i>(tup), tup); }
template <class ...U> print_op(tuple<U...>) { return print_tuple_utils<0, tuple<U...>>(out, u); }
template <class Con, class = decltype(begin(declval<Con>()))> typename enable_if <!is_same<Con, string>::value, ostream&>::type operator << (ostream &out, const Con &con) { out << '{'; for (__typeof(con.begin()) it = con.begin(); it != con.end(); ++it) out << (it == con.begin() ? "" : ", ") << *it; return out << '}'; }

// end of template

void process(void) {
	int n, m, q; cin >> n >> m >> q;
	vector <array <int, 3>> events;
	REP(i, m) {
		int x, y; cin >> x >> y;
		events.push_back(array{i, x, y});
	}
	int cnt = 0;
	REP(i, q) {
		int t; cin >> t;
		if (t == 1) {
			int a; cin >> a;
			events.push_back(array{-t, a - 1, cnt++});
		} else if (t < 4) {
			int l; cin >> l;
			events.push_back(array{-t, l, 0});
		} else {
			int x, y; cin >> x >> y;
			events.emplace_back(array{m++, x, y});
		}
	}
	vector <pair <int, int>> res(cnt);
	vector <int> pos(m);
	vector <int> lab_x(m), lab_y(m), val_x(m), val_y(m);
	vector <vector <int>> comps_x(m), comps_y(m);
	function<void(int, int, const vector <array <int, 3>> &)> solve = [&] (int l, int r, const vector <array <int, 3>> &events) {
		if (events.empty() || l > r) return;
		int mid = l + r >> 1;
		int px = mid, py = n - mid;
		vector <array <int, 3>> left, right;
		priority_queue <pair <int, int>, vector <pair <int, int>>, greater <pair <int, int>>> pq_x, pq_y;
		for (auto e: events) {
			if (e[0] == -1) {
				int a = e[1];
				if (pos[a]) (pos[a] == -1 ? left : right).push_back(e);
				else res[e[2]] = pair{val_x[lab_x[a]], val_y[lab_y[a]]};
			} else if (e[0] == -2) {
				int l = e[1];
				if (l < py) {
					right.push_back(e);
					while (!pq_y.empty() && pq_y.top().fi <= l) {
						int u = pq_y.top().se; pq_y.pop();
						for (int v: comps_y[u]) if (!pos[v]) {
							pos[v] = 1;
							right.push_back(array{v, n - l, val_y[u]});
						}
					}
				} else {
					if (l > py) left.push_back(e);
					int cur = -1;
					while (!pq_x.empty() && pq_x.top().fi <= n - l) {
						int u = pq_x.top().se; pq_x.pop();
						if (cur == -1) cur = u;
						else {
							if (comps_x[cur].size() < comps_x[u].size()) swap(cur, u);
							for (int v: comps_x[u]) if (!pos[v]) {
								lab_x[v] = cur;
								comps_x[cur].push_back(v);
							}
							comps_x[u].clear();
						}
					}
					if (cur != -1) {
						val_x[cur] = n - l;
						pq_x.emplace(n - l, cur);
					}
				}
			} else if (e[0] == -3) {
				int l = e[1];
				if (l < px) {
					left.push_back(e);
					while (!pq_x.empty() && pq_x.top().fi <= l) {
						int u = pq_x.top().se; pq_x.pop();
						for (int v: comps_x[u]) if (!pos[v]) {
							pos[v] = -1;
							left.push_back(array{v, val_x[u], n - l});
						}
					}
				} else {
					if (l > px) right.push_back(e);
					int cur = -1;
					while (!pq_y.empty() && pq_y.top().fi <= n - l) {
						int u = pq_y.top().se; pq_y.pop();
						if (cur == -1) cur = u;
						else {
							if (comps_y[cur].size() < comps_y[u].size()) swap(cur, u);
							for (int v: comps_y[u]) if (!pos[v]) {
								lab_y[v] = cur;
								comps_y[cur].push_back(v);
							}
							comps_y[u].clear();
						}
					}
					if (cur != -1) {
						val_y[cur] = n - l;
						pq_y.emplace(n - l, cur);
					}
				}
			} else {
				int u = e[0], x = e[1], y = e[2];
				if (x > px) {
					pos[u] = 1;
					right.push_back(e);
				} else if (y > py) {
					pos[u] = -1;
					left.push_back(e);
				} else {
					pos[u] = 0;

					comps_x[u] = vector {u};
					lab_x[u] = u;
					val_x[u] = x;
					pq_x.emplace(x, u);

					comps_y[u] = vector {u};
					lab_y[u] = u;
					val_y[u] = y;
					pq_y.emplace(y, u);
				}
			}
		}
		solve(l, mid - 1, left);
		solve(mid + 1, r, right);
	};
	solve(0, n, events);
	REP(i, cnt) cout << res[i].fi << ' ' << res[i].se << '\n';
}

int main(void) {
	ios_base::sync_with_stdio(false); cin.tie(nullptr); // cout.tie(nullptr);
	file("JOI20_sweeping");
	// int t; cin >> t; while (t--)
	process();
	// cerr << "Time elapsed: " << TIME << " s.\n";
	return (0^0);
}

Compilation message

sweeping.cpp: In lambda function:
sweeping.cpp:72:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   72 |   int mid = l + r >> 1;
      |             ~~^~~
sweeping.cpp: In function 'int main()':
sweeping.cpp:30:61: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   30 |     #define file(name) if (fopen(name".inp", "r")) { freopen(name".inp", "r", stdin); freopen(name".out", "w", stdout); }
      |                                                      ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
sweeping.cpp:175:2: note: in expansion of macro 'file'
  175 |  file("JOI20_sweeping");
      |  ^~~~
sweeping.cpp:30:94: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   30 |     #define file(name) if (fopen(name".inp", "r")) { freopen(name".inp", "r", stdin); freopen(name".out", "w", stdout); }
      |                                                                                       ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
sweeping.cpp:175:2: note: in expansion of macro 'file'
  175 |  file("JOI20_sweeping");
      |  ^~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 1112 KB Output is correct
2 Correct 5 ms 860 KB Output is correct
3 Correct 2 ms 1116 KB Output is correct
4 Correct 7 ms 1368 KB Output is correct
5 Correct 5 ms 1372 KB Output is correct
6 Correct 2 ms 844 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2004 ms 156260 KB Output is correct
2 Correct 2015 ms 156300 KB Output is correct
3 Correct 1889 ms 159772 KB Output is correct
4 Correct 1698 ms 175084 KB Output is correct
5 Correct 3776 ms 170644 KB Output is correct
6 Correct 3014 ms 171916 KB Output is correct
7 Correct 1948 ms 157672 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1391 ms 154500 KB Output is correct
2 Correct 1431 ms 173368 KB Output is correct
3 Correct 1016 ms 190168 KB Output is correct
4 Correct 1661 ms 251596 KB Output is correct
5 Correct 1506 ms 208844 KB Output is correct
6 Correct 1330 ms 178420 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1391 ms 154500 KB Output is correct
2 Correct 1431 ms 173368 KB Output is correct
3 Correct 1016 ms 190168 KB Output is correct
4 Correct 1661 ms 251596 KB Output is correct
5 Correct 1506 ms 208844 KB Output is correct
6 Correct 1330 ms 178420 KB Output is correct
7 Correct 1838 ms 171856 KB Output is correct
8 Correct 1865 ms 165904 KB Output is correct
9 Correct 1835 ms 169508 KB Output is correct
10 Correct 1753 ms 187336 KB Output is correct
11 Correct 2441 ms 215728 KB Output is correct
12 Correct 3505 ms 190512 KB Output is correct
13 Correct 2950 ms 285092 KB Output is correct
14 Correct 98 ms 28084 KB Output is correct
15 Correct 538 ms 140760 KB Output is correct
16 Correct 1779 ms 167984 KB Output is correct
17 Correct 1798 ms 168800 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 1112 KB Output is correct
2 Correct 5 ms 860 KB Output is correct
3 Correct 2 ms 1116 KB Output is correct
4 Correct 7 ms 1368 KB Output is correct
5 Correct 5 ms 1372 KB Output is correct
6 Correct 2 ms 844 KB Output is correct
7 Correct 2004 ms 156260 KB Output is correct
8 Correct 2015 ms 156300 KB Output is correct
9 Correct 1889 ms 159772 KB Output is correct
10 Correct 1698 ms 175084 KB Output is correct
11 Correct 3776 ms 170644 KB Output is correct
12 Correct 3014 ms 171916 KB Output is correct
13 Correct 1948 ms 157672 KB Output is correct
14 Correct 1391 ms 154500 KB Output is correct
15 Correct 1431 ms 173368 KB Output is correct
16 Correct 1016 ms 190168 KB Output is correct
17 Correct 1661 ms 251596 KB Output is correct
18 Correct 1506 ms 208844 KB Output is correct
19 Correct 1330 ms 178420 KB Output is correct
20 Correct 1838 ms 171856 KB Output is correct
21 Correct 1865 ms 165904 KB Output is correct
22 Correct 1835 ms 169508 KB Output is correct
23 Correct 1753 ms 187336 KB Output is correct
24 Correct 2441 ms 215728 KB Output is correct
25 Correct 3505 ms 190512 KB Output is correct
26 Correct 2950 ms 285092 KB Output is correct
27 Correct 98 ms 28084 KB Output is correct
28 Correct 538 ms 140760 KB Output is correct
29 Correct 1779 ms 167984 KB Output is correct
30 Correct 1798 ms 168800 KB Output is correct
31 Correct 1854 ms 184172 KB Output is correct
32 Correct 1945 ms 179724 KB Output is correct
33 Correct 1760 ms 173160 KB Output is correct
34 Correct 2245 ms 201296 KB Output is correct
35 Correct 2279 ms 203672 KB Output is correct
36 Correct 1817 ms 200376 KB Output is correct
37 Correct 3619 ms 279120 KB Output is correct
38 Correct 3235 ms 288976 KB Output is correct
39 Correct 2758 ms 257512 KB Output is correct
40 Correct 1842 ms 184940 KB Output is correct