結果
| 問題 | No.2277 Honest or Dishonest ? |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-04-22 04:04:49 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 37 ms / 2,000 ms |
| コード長 | 1,809 bytes |
| 記録 | |
| コンパイル時間 | 2,135 ms |
| コンパイル使用メモリ | 204,800 KB |
| 最終ジャッジ日時 | 2025-02-12 12:55:43 |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 50 |
ソースコード
#include <bits/stdc++.h>
template <typename T = int>
struct xor_union_find {
std::vector<int> d;
std::vector<T> p;
xor_union_find(int n = 0) : d(n, -1), p(n, 0) {}
// returns the leader of x
int leader(int x) {
if (d[x] < 0) return x;
int r = leader(d[x]);
p[x] ^= p[d[x]];
return d[x] = r;
}
// merge x and y with a condition that w = weight(y) ^ weight(x)
bool merge(int x, int y, T w) {
w ^= potential(x) ^ potential(y);
x = leader(x);
y = leader(y);
if (x == y) return false;
if (d[x] > d[y]) std::swap(x, y);
d[x] += d[y];
d[y] = x;
p[y] = w;
return true;
}
// returns if x and y are connected
bool same(int x, int y) {
return leader(x) == leader(y);
}
// returns the size of component that x belongs to
int size(int x) {
return -d[leader(x)];
}
// returns potential(x) := weight(x) ^ weight(leader(x))
long long potential(int x) {
leader(x);
return p[x];
}
};
#include <atcoder/modint.hpp>
using mint = atcoder::modint998244353;
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N, Q;
cin >> N >> Q;
xor_union_find<int> uf(N);
int A[Q], B[Q], C[Q];
for (int i = 0; i < Q; i++) {
cin >> A[i] >> B[i] >> C[i];
A[i]--;
B[i]--;
uf.merge(A[i], B[i], C[i]);
}
for (int i = 0; i < Q; i++) {
if ((uf.potential(A[i]) ^ uf.potential(B[i])) != C[i]) {
cout << 0 << endl;
return 0;
}
}
set<int> leaders;
for (int i = 0; i < N; i++) {
leaders.insert(uf.leader(i));
}
cout << mint(2).pow(leaders.size()).val() << endl;
}