結果
問題 | No.2293 無向辺 2-SAT |
ユーザー |
|
提出日時 | 2023-05-05 21:53:37 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,920 bytes |
コンパイル時間 | 2,466 ms |
コンパイル使用メモリ | 81,536 KB |
実行使用メモリ | 282,736 KB |
最終ジャッジ日時 | 2024-11-23 07:14:08 |
合計ジャッジ時間 | 92,644 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 12 WA * 28 TLE * 13 |
ソースコード
import sys,random,bisectfrom collections import deque,defaultdictfrom heapq import heapify,heappop,heappushfrom itertools import permutationsfrom math import gcd,loginput = lambda :sys.stdin.readline().rstrip()mi = lambda :map(int,input().split())li = lambda :list(mi())class UnionFindVerSize():def __init__(self, N):self._parent = [n for n in range(0, N)]self._size = [1] * Nself.group = Ndef find_root(self, x):if self._parent[x] == x: return xself._parent[x] = self.find_root(self._parent[x])return self._parent[x]def unite(self, x, y):gx = self.find_root(x)gy = self.find_root(y)if gx == gy: returnself.group -= 1if self._size[gx] < self._size[gy]:self._parent[gx] = gyself._size[gy] += self._size[gx]else:self._parent[gy] = gxself._size[gx] += self._size[gy]def get_size(self, x):return self._size[self.find_root(x)]def is_same_group(self, x, y):return self.find_root(x) == self.find_root(y)N,Q = mi()parent = [(i,-1) for i in range(N)]sz = [1] * Ncontradict = Falsefree = Nparent_change = []sz_change = []contradict_change = []free_change = []def calc_val(v):res = 0while parent[v][1]!=-1:res ^= parent[v][1]v = parent[v][0]return resdef add_query(t,u,v,p):global contradict,freeif parent[u][0] == parent[v][0]:cu,cv = calc_val(u),calc_val(v)if cu!=cv^p:contradict_change.append((t,contradict,True))contradict = Truereturnif sz[u] > sz[v]:u,v = v,uparent_change.append((t,u,parent[u],(v,p)))parent[u] = (v,p)sz_change.append((t,v,sz[v],sz[v]+sz[u]))sz[v] += sz[u]free_change.append((t,free,free-1))free -= 1def undo_query(t):global contradict,freewhile parent_change and parent_change[-1][0] == t:_,v,pre,now = parent_change.pop()parent[v] = prewhile sz_change and sz_change[-1][0] == t:_,v,pre,now = sz_change.pop()sz[v] = prewhile contradict_change and contradict_change[-1][0] == t:_,pre,now = contradict_change.pop()contradict = prewhile free_change and free_change[-1][0] == t:_,pre,now = free_change.pop()free = pretime_stack = []for tim in range(Q):t,*query = mi()if t == 1:u,v = queryu,v = u-1,v-1if u!=v:add_query(tim,u,v,1)time_stack.append(tim)elif t == 2:u,v = queryu,v = u-1,v-1if u!=v:add_query(tim,u,v,0)time_stack.append(tim)else:while time_stack:undo_query(time_stack.pop())if contradict:print(0)else:print(pow(2,free,998244353))