結果
| 問題 |
No.2672 Subset Xor Sum
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2024-03-15 21:54:54 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,013 bytes |
| コンパイル時間 | 175 ms |
| コンパイル使用メモリ | 82,072 KB |
| 実行使用メモリ | 206,092 KB |
| 最終ジャッジ日時 | 2024-09-30 00:58:57 |
| 合計ジャッジ時間 | 5,693 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 7 WA * 22 TLE * 1 -- * 36 |
ソースコード
import collections
from collections import defaultdict
class UnionFind():
def __init__(self):
'''
unionfind経路圧縮あり,要素にtupleや文字列可,始めに要素数指定なし
'''
self.parents = dict() # {子要素:親ID,}
self.members_set = collections.defaultdict(lambda : set()) # keyが根でvalueが根に属する要素要素(tupleや文字列可)
self.roots_set = set() # 根の集合(tupleや文字列可)
self.key_ID = dict() # 各要素にIDを割り振る
self.ID_key = dict() # IDから要素名を復元する
self.cnt = 0 # IDのカウンター
def dictf(self,x): # 要素名とIDをやり取りするところ
if x in self.key_ID:
return self.key_ID[x]
else:
self.cnt += 1
self.key_ID[x] = self.cnt
self.parents[x] = self.cnt
self.ID_key[self.cnt] = x
self.members_set[x].add(x)
self.roots_set.add(x)
return self.key_ID[x]
def find(self, x):
ID_x = self.dictf(x)
if self.parents[x] == ID_x:
return x
else:
self.parents[x] = self.key_ID[self.find(self.ID_key[self.parents[x]])]
return self.ID_key[self.parents[x]]
def union(self, x, y):
x = self.find(x)
y = self.find(y)
if self.parents[x] > self.parents[y]:
x, y = y, x
if x == y:
return
for i in self.members_set[y]:
self.members_set[x].add(i)
self.members_set[y] = set()
self.roots_set.remove(y)
self.parents[y] = self.key_ID[x]
def size(self, x):#xが含まれる集合の要素数
return len(self.members_set[self.find(x)])
def same(self, x, y):#同じ集合に属するかの判定
return self.find(x) == self.find(y)
def members(self, x):#xを含む集合の要素
return self.members_set[self.find(x)]
def roots(self):#根の要素
return self.roots_set
def group_count(self):#根の数
return len(self.roots_set)
def all_group_members(self):#根とその要素
return {r: self.members_set[r] for r in self.roots_set}
N = int(input())
A = list(map(int, input().split()))
uf = UnionFind()
info_numbers = defaultdict(list)
info_prime = defaultdict(int)
for i in range(N):
p = A[i]
for i in range(13, -1, -1):
if p >= 2 ** i:
info_numbers[A[i]].append(2 ** i)
info_prime[2 ** i] += 1
p -= 2 ** i
for i in range(N):
for j in range(1, len(info_numbers[A[i]])):
uf.union(info_numbers[A[i]][j], info_numbers[A[i]][0])
for j in info_prime.values():
if j % 2 != 0:
print("No")
exit()
if uf.group_count() % 2 != 0:
print("No")
else:
print("Yes")