Submission #882537

#TimeUsernameProblemLanguageResultExecution timeMemory
882537marvinthangSweeping (JOI20_sweeping)C++17
10 / 100
3724 ms181868 KiB
/************************************* * 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; // cout << l << ' ' << r << '\n'; 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]; // cout << l << ' ' << py << '\n'; if (l < px) { 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; right.push_back(array{v, val_x[u], n - l}); } } } else { 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); } } } // if (l >= 4) cout << events << '\n'; // cout << "-----------\n"; 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 (stderr)

sweeping.cpp: In lambda function:
sweeping.cpp:73:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   73 |   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:179:2: note: in expansion of macro 'file'
  179 |  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:179:2: note: in expansion of macro 'file'
  179 |  file("JOI20_sweeping");
      |  ^~~~
#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...