結果
| 問題 |
No.2293 無向辺 2-SAT
|
| コンテスト | |
| ユーザー |
eve__fuyuki
|
| 提出日時 | 2024-04-18 15:32:27 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 231 ms / 4,000 ms |
| コード長 | 2,581 bytes |
| コンパイル時間 | 2,210 ms |
| コンパイル使用メモリ | 201,112 KB |
| 最終ジャッジ日時 | 2025-02-21 03:01:20 |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 53 |
ソースコード
#include <bits/stdc++.h>
#include <atcoder/modint>
using namespace std;
using mint = atcoder::modint998244353;
void fast_io() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
}
class RollbackUnionFind {
private:
vector<int> par_or_rank;
vector<pair<int, int>> history_par;
int n;
public:
RollbackUnionFind(int sz_)
: n(sz_), par_or_rank(sz_, -1), history_par(0), ans(0) {}
int ans;
int leader(int a) {
if (par_or_rank[a] < 0) {
return a;
}
return leader(par_or_rank[a]);
}
bool same(int a, int b) { return leader(a) == leader(b); }
void merge(int a, int b) {
a = leader(a);
b = leader(b);
history_par.push_back({a, par_or_rank[a]});
history_par.push_back({b, par_or_rank[b]});
if (a == b) {
return;
}
if (-par_or_rank[a] < -par_or_rank[b]) {
swap(a, b);
}
par_or_rank[a] += par_or_rank[b];
par_or_rank[b] = a;
}
void undo() {
par_or_rank[history_par.back().first] = history_par.back().second;
history_par.pop_back();
par_or_rank[history_par.back().first] = history_par.back().second;
history_par.pop_back();
}
void clear() {
while (history_par.size()) {
undo();
}
}
};
int main() {
fast_io();
int n, q;
cin >> n >> q;
vector<mint> p2(n + 1, 1);
for (int i = 1; i <= n; i++) {
p2[i] = p2[i - 1] * 2;
}
mint inv_2 = mint(2).inv();
RollbackUnionFind uf(2 * n);
mint ans = p2[n];
for (; q--;) {
int type;
cin >> type;
if (type == 1) {
int u, v;
cin >> u >> v;
u--, v--;
if (!uf.same(u, v)) {
uf.merge(u, v);
uf.merge(u + n, v + n);
if (uf.same(u, u + n) || uf.same(v, v + n)) {
ans = 0;
} else {
ans *= inv_2;
}
}
}
if (type == 2) {
int u, v;
cin >> u >> v;
u--, v--;
if (!uf.same(u, v + n)) {
uf.merge(u, v + n);
uf.merge(u + n, v);
if (uf.same(u, u + n) || uf.same(v, v + n)) {
ans = 0;
} else {
ans *= inv_2;
}
}
}
if (type == 3) {
ans = p2[n];
uf.clear();
}
cout << ans.val() << "\n";
}
}
eve__fuyuki