제출 #876209

#제출 시각아이디문제언어결과실행 시간메모리
876209sleepntsheepJoker (BOI20_joker)C++17
100 / 100
151 ms32692 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; vector<int> rank, up; int cb, dumb; vector<tuple<int, int, pair<int, int>, int, int, int>> save; dsu(int n) : rank(n, 1), cb(1), up(n) { for (int i = 0; i < n; ++i) p.emplace_back(i, 0); } pair<int, int> find(int x) { if (p[x].first == x) return {x, 0}; auto [A, B] = find(p[x].first); return {A, B ^ up[x]}; } int unite(int x0, int y0) { int col { 1 }; auto [x, A] { find(x0) }; auto [y, B] { find(y0) }; col ^= A ^ B; if (rank[x] > rank[y]) swap(x, y); save.emplace_back(x, y, p[x], cb, rank[x], rank[y]); if (x == y) { if (A == B) cb = 0; return 0; } if (rank[x] == rank[y]) ++rank[y]; p[x] = {y, A^B^1}; up[x] = col; return 1; } void rollback() { auto [x, y, px, cb0, rx, ry] = save.back(); save.pop_back(); p[x] = px; rank[x] = rx, rank[y] = ry; 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] <= --y ? "NO\n" : "YES\n"); return 0; }

컴파일 시 표준 에러 (stderr) 메시지

Joker.cpp: In constructor 'dsu::dsu(int)':
Joker.cpp:26:9: warning: 'dsu::cb' will be initialized after [-Wreorder]
   26 |     int cb, dumb;
      |         ^~
Joker.cpp:25:23: warning:   'std::vector<int> dsu::up' [-Wreorder]
   25 |     vector<int> rank, up;
      |                       ^~
Joker.cpp:29:5: warning:   when initialized here [-Wreorder]
   29 |     dsu(int n) : rank(n, 1), cb(1), up(n) { for (int i = 0; i < n; ++i) p.emplace_back(i, 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...