結果
問題 | No.2277 Honest or Dishonest ? |
ユーザー |
|
提出日時 | 2023-04-21 21:48:53 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 361 ms / 2,000 ms |
コード長 | 2,571 bytes |
コンパイル時間 | 278 ms |
コンパイル使用メモリ | 82,048 KB |
実行使用メモリ | 110,848 KB |
最終ジャッジ日時 | 2024-11-08 06:29:01 |
合計ジャッジ時間 | 14,721 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 50 |
ソースコード
import sys, randominput = lambda : sys.stdin.readline().rstrip()write = lambda x: sys.stdout.write(x+"\n"); writef = lambda x: print("{:.12f}".format(x))debug = lambda x: sys.stderr.write(x+"\n")YES="Yes"; NO="No"; pans = lambda v: print(YES if v else NO); INF=10**18LI = lambda : list(map(int, input().split())); II=lambda : int(input()); SI=lambda : [ord(c)-ord("a") for c in input()]def debug(_l_):for s in _l_.split():print(f"{s}={eval(s)}", end=" ")print()def dlist(*l, fill=0):if len(l)==1:return [fill]*l[0]ll = l[1:]return [dlist(*ll, fill=fill) for _ in range(l[0])]class UF:# unionfinddef __init__(self, n):self.n = nself.parent = list(range(n))self.size = [1] * n# self.es = [0] * ndef check(self):return [self.root(i) for i in range(self.n)]def root(self, i):inter = set()while self.parent[i]!=i:inter.add(i)i = self.parent[i]r = ifor i in inter:self.parent[i] = rreturn rdef merge(self, i, j):# 繋いだかどうかを返すri = self.root(i)rj = self.root(j)if ri==rj:# self.es[ri] += 1return Falseif self.size[ri]>self.size[rj]:ri,rj = rj,riself.parent[ri] = rjself.size[rj] += self.size[ri]# self.es[rj] += self.es[ri] + 1return Truedef rs(self):return sorted(set([self.root(i) for i in range(self.n)]))n,q = list(map(int, input().split()))uf = UF(n)ab = []for i in range(q):a,b,c = LI()a -= 1b -= 1if c==0:uf.merge(a,b)else:ab.append((a,b))rs = uf.rs()ns = {r: [] for r in rs}M = 998244353for a,b in ab:ra = uf.root(a)rb = uf.root(b)if ra==rb:ans = 0breakelse:ns[ra].append(rb)ns[rb].append(ra)else:num = 0done = {}for r in rs:if r in done:continueq = [r]done[r] = 0num += 1ng = 0while q:u = q.pop()for v in ns[u]:if v not in done:done[v] = done[u]^1q.append(v)else:if done[v]==done[u]:ng = 1breakif ng:breakif ng:ans = 0breakelse:ans = pow(2, num, M)print(ans%M)