Submission #876196

#TimeUsernameProblemLanguageResultExecution timeMemory
876196sleepntsheepJoker (BOI20_joker)C++17
0 / 100
230 ms17992 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<int> p; vector<int> pp, bi; vector<tuple<int, int, int, int, int>> save; int cb; dsu(int n) : p(n, -1), pp(n, 0), bi(n, 1), cb(n) {} int find(int x) { if (p[x] < 0) return x; auto X { find(p[x]) }; pp[x] = pp[p[x]] ^ 1; return X; } int unite(int x0, int y0) { int x { find(x0) } , y { find(y0) }; if (x == y) { save.emplace_back(x, y, p[x], (bi[x] << 3) | (bi[y] << 2) | (pp[x] << 1) | (pp[y] << 0), cb); if (pp[x0] == pp[y0] && bi[x]) cb += p[x], bi[x] = 0; return 0; } if (-p[x] > -p[y]) swap(x, y); save.emplace_back(x, y, p[x], (bi[x] << 3) | (bi[y] << 2) | (pp[x] << 1) | (pp[y] << 0), cb); pp[x] = pp[x0] ^ pp[y0] ^ 1; if (bi[y] && !bi[x]) cb += p[y], bi[y] = 0; else if (bi[x] && !bi[y]) cb += p[x]; p[y] += p[x], p[x] = y; return 1; } void rollback() { auto [x, y, px, stf, cb0] = save.back(); save.pop_back(); if (x != y) p[y] -= (p[x] = px); int bix = (stf & 8) >> 3; int biy = (stf & 4) >> 2; int ppx = (stf & 2) >> 1; int ppy = (stf & 1) >> 0; pp[x] = ppx; pp[y] = ppy; bi[y] = biy; bi[x] = bix; 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 != n && j < m; ++j) qd.pop(); if (qd.ds.cb == n) 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...