結果
| 問題 | No.3695 同室と別室 |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-09-09 23:47:17 |
| 言語 | PyPy3 (7.3.23 + ACL) |
| 結果 |
WA
不安定
|
| 実行時間 | - |
| コード長 | 2,351 bytes |
| 記録 | |
| コンパイル時間 | 600 ms |
| コンパイル使用メモリ | 81,280 KB |
| 実行使用メモリ | 141,952 KB |
| 最終ジャッジ日時 | 2026-09-09 23:47:21 |
| 合計ジャッジ時間 | 3,629 ms |
|
ジャッジサーバーID (参考情報) |
judge2_1 / judge3_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 9 WA * 4 |
ソースコード
# https://yukicoder.me/problems/no/3695
from collections import deque
MOD = 998244353
class UnionFind:
"""
UnionFindの基本的な処理を実装したクラス
"""
def __init__(self, size):
self.root = [i for i in range(size)]
self.size = [1] * size
def get_root(self, v):
if v == self.root[v]:
return v
else:
old_root = self.root[v]
new_root = self.get_root(old_root)
self.root[v] = new_root
return new_root
def merge(self, u, v):
root_u = self.get_root(u)
root_v = self.get_root(v)
if root_u == root_v:
return False
if self.size[root_u] >= self.size[root_v]:
self.size[root_u] += self.size[root_v]
self.root[root_v] = root_u
self.root[v] = root_u
else:
self.size[root_v] += self.size[root_u]
self.root[root_u] = root_v
self.root[u] = root_v
return True
def main():
N, Q = map(int, input().split())
zeros = []
ones = []
for _ in range(Q):
t, a, b = map(int ,input().split())
if t == 0:
zeros.append((a - 1, b - 1))
else:
ones.append((a - 1, b - 1))
uf = UnionFind(N)
for a, b in zeros:
uf.merge(a, b)
next_nodes = {}
for i in range(N):
r_i = uf.get_root(i)
next_nodes[r_i] = set()
for c, d in ones:
r_i = uf.get_root(c)
r_j = uf.get_root(d)
if r_i == r_j:
print(0)
return
next_nodes[r_i].add(r_j)
next_nodes[r_j].add(r_i)
compose_count = 0
passed = {}
for s_i in list(next_nodes.keys()):
if s_i not in passed:
passed[s_i] = 0
queue = deque()
queue.append(s_i)
while len(queue) > 0:
v = queue.popleft()
for w in next_nodes[v]:
if w not in passed:
passed[w] = 1 - passed[v]
else:
if passed[w] == passed[v]:
print(0)
return
compose_count += 1
answer = pow(2, compose_count, MOD)
print(answer)
if __name__ == "__main__":
main()