제출 #876205

#제출 시각아이디문제언어결과실행 시간메모리
876205sleepntsheepJoker (BOI20_joker)C++17
0 / 100
81 ms22048 KiB
#include <cstdio> #include <cstring> #include <cassert> #include <string> #include <deque> #include <vector> #include <map> #include <queue> #include <algorithm> #include <iostream> #include <utility> using namespace std; using i64 = long long; using f80 = long double; #define ShinLena cin.tie(nullptr)->sync_with_stdio(false) #define N 200005 #define ALL(x) x.begin(), x.end() int n, m, q, e[N][2], r[N+1]; struct dsu { vector<pair<int, int>> p; int cb, dumb; vector<tuple<int, int, pair<int, int>, int>> save; dsu(int n) : p(n, make_pair(-1, 0)), cb(1) {} pair<int, int> find(int x) { if (p[x].first >= 0) { auto [A, B] = find(p[x].first); p[x].second ^= B; } else dumb = x; return {dumb, p[x].second}; } int unite(int x0, int y0) { auto [x, A] { find(x0) }; auto [y, B] { find(y0) }; if (-p[x].first > -p[y].first) swap(x, y); save.emplace_back(x, y, p[x], cb); if (x == y) { if (A == B) cb = 0; return 0; } p[y].first += p[x].first; p[x] = {y, A^B^1}; return 1; } void rollback() { auto [x, y, px, cb0] = save.back(); save.pop_back(); if (x != y) p[y].first -= px.first, p[x] = px; cb = cb0; } }; struct qdsu { dsu ds; int bottom; struct upd { char type; int x, y; }; vector<upd> S; qdsu(int n) : ds(n), bottom(0) {} void bottomify() { while (bottom < (int)S.size() && S[bottom].type == 'B') ++bottom; } void fix() { if (S.empty() || S.back().type == 'A') return; bottomify(); deque<upd> s[2]; for (int j = (int)S.size() - 1; (s[1].size() != s[0].size() || s[0].empty()) && j >= bottom; --j) s[S[j].type == 'A'].push_front(S[j]), ds.rollback(), S.pop_back(); for (auto j : {0, 1}) for (auto x : s[j]) S.push_back(x), ds.unite(x.x, x.y); bottomify(); } void new_phase() { for (auto i = S.size(); i--;) ds.rollback(); for (auto i = S.size(); i--;) S[i].type = 'A', ds.unite(S[i].x, S[i].y); reverse(S.begin(), S.end()); bottom = 0; } void pop() { bottomify(); if (bottom == (int)S.size()) new_phase(); fix(); S.pop_back(); ds.rollback(); } int unite(int x, int y) { S.push_back(upd{'B', x, y}); return ds.unite(x, y); } }; int main() { ShinLena; cin >> n >> m >> q; qdsu qd(n); for (int i = 0; i < m; ++i) cin >> e[i][0] >> e[i][1], qd.unite(--e[i][0], --e[i][1]); for (int i = 0, j = 0; i < m; ++i) { for (; !qd.ds.cb && j < m; ++j) qd.pop(); if (qd.ds.cb) r[i] = j - 1; else r[i] = 1e9; qd.unite(e[i][0], e[i][1]); } for (int i = 0, x, y; i < q; ++i) cin >> x >> y, cout << (r[x-1] <= y-1 ? "NO\n" : "YES\n"); return 0; }
#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...