結果

問題 No.2293 無向辺 2-SAT
ユーザー ぷら
提出日時 2023-05-05 22:01:14
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
WA  
実行時間 -
コード長 3,231 bytes
コンパイル時間 2,308 ms
コンパイル使用メモリ 204,776 KB
最終ジャッジ日時 2025-02-12 18:11:21
ジャッジサーバーID
(参考情報)
judge2 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 14 WA * 39
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

#include <bits/stdc++.h>
using namespace std;
constexpr int mod = 998244353;
long long modpow(long long a,long long b) {
long long ans = 1;
while(b) {
if(b & 1) {
(ans *= a) %= mod;
}
(a *= a) %= mod;
b /= 2;
}
return ans;
}
struct UnionFind {
vector<int> par;
vector<int> size;
vector<vector<int>>cld;
UnionFind(int n) {
par.resize(n);
size.resize(n,1);
cld.resize(n);
for(int i = 0; i < n; i++) {
par[i] = i;
cld[i].push_back(i);
}
}
int find(int x) {
if(par[x] == x) {
return x;
}
return par[x] = find(par[x]);
}
bool same(int x, int y) {
return find(x) == find(y);
}
int consize(int x) {
return size[find(x)];
}
bool unite(int x,int y) {
x = find(x);
y = find(y);
if(x == y) {
return false;
}
if(size[x] > size[y]) {
swap(x,y);
}
par[x] = y;
size[y] += size[x];
return true;
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N,Q;
cin >> N >> Q;
UnionFind uf(N);
vector<int>r(N,-1);
int cnt = N;
bool ok = true;
vector<int>tmp;
for(int i = 0; i < Q; i++) {
int f;
cin >> f;
if(f == 1) {
int u,v;
cin >> u >> v;
u--;
v--;
tmp.push_back(u);
tmp.push_back(v);
if(!uf.same(u,v)) {
cnt--;
if(uf.size[u] < uf.size[v]) {
swap(u,v);
}
if(r[u] == -1) {
r[u] = 0;
}
for(int j:uf.cld[v]) {
r[j] = r[u];
}
uf.unite(u,v);
}
else if(r[u] != r[v]) {
ok = false;
}
if(ok) {
cout << modpow(2,cnt) << "\n";
}
else {
cout << 0 << "\n";
}
}
if(f == 2) {
int u,v;
cin >> u >> v;
u--;
v--;
tmp.push_back(u);
tmp.push_back(v);
if(!uf.same(u,v)) {
cnt--;
if(uf.size[u] < uf.size[v]) {
swap(u,v);
}
if(r[u] == -1) {
r[u] = 0;
}
for(int j:uf.cld[v]) {
r[j] = !r[u];
}
uf.unite(u,v);
}
else if(r[u] == r[v]) {
ok = false;
}
if(ok) {
cout << modpow(2,cnt) << "\n";
}
else {
cout << 0 << "\n";
}
}
if(f == 3) {
cnt = N;
ok = true;
for(int j:tmp) {
uf.par[j] = j;
uf.size[j] = 1;
uf.cld[j].clear();
r[j] = -1;
}
tmp.clear();
cout << modpow(2,N) << "\n";
}
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0