結果
| 問題 | No.649 ここでちょっとQK! |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2022-07-04 14:16:37 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
MLE
|
| 実行時間 | - |
| コード長 | 3,706 bytes |
| コンパイル時間 | 408 ms |
| コンパイル使用メモリ | 82,176 KB |
| 実行使用メモリ | 661,408 KB |
| 最終ジャッジ日時 | 2024-12-14 03:34:46 |
| 合計ジャッジ時間 | 35,418 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 26 MLE * 6 |
ソースコード
class Binary_Trie_Vertex:
def __init__(self):
self.left = None
self.right = None
self.parent = None
self.size = 0
class Binary_Trie:
def __init__(self, logn, ismulti = False):
self.logn = logn
self.root = Binary_Trie_Vertex()
self.bi = [1 << i for i in range(logn)]
self.multi = ismulti
def add(self, x):
V = self.root
plus = False
for i in range(self.logn - 1, -1, -1):
if x >> i & 1:
if V.right is None:
V.right = Binary_Trie_Vertex()
V.right.parent = V
plus = True
V = V.right
else:
if V.left is None:
V.left = Binary_Trie_Vertex()
V.left.parent = V
plus = True
V = V.left
if plus or self.multi:
while V.parent is not None:
V.size += 1
V = V.parent
V.size += 1
def remove(self, x):
V = self.root
for i in range(self.logn - 1, -1, -1):
if x >> i & 1:
if V.right is None:
return False
V = V.right
else:
if V.left is None:
return False
V = V.left
V2 = V
while V2.parent is not None:
V2.size -= 1
V2 = V2.parent
V2.size -= 1
while V.size == 0 and V != self.root:
P = V.parent
if P.right == V:
P.right = None
else:
P.left = None
if P.right is None and P.left is None:
pass
else:
return True
V = P
return True
def search(self, x):
V = self.root
for i in range(self.logn - 1, -1, -1):
if x >> i & 1:
if V.right is None:
return False
V = V.right
else:
if V.left is None:
return False
V = V.left
return True
def xor_min(self, x):
xor = 0
V = self.root
for i in range(self.logn - 1, -1, -1):
if x >> i & 1:
if V.right is not None:
V = V.right
else:
xor += self.bi[i]
V = V.left
else:
if V.left is not None:
V = V.left
else:
xor += self.bi[i]
V = V.right
return xor
def __getitem__(self, k):
return self.Kth_element(k)
def Kth_element(self, k):
if k < 0:
k = self.root.size + k
k += 1
if k > self.root.size or k <= 0:
return None
ret = 0
V = self.root
for i in range(self.logn - 1, -1, -1):
if V.left is None:
ret += self.bi[i]
V = V.right
elif V.right is None:
V = V.left
elif V.left.size >= k:
V = V.left
else:
ret += self.bi[i]
k -= V.left.size
V = V.right
return ret
Q, k = map(int, input().split())
bt = Binary_Trie(60, True)
for _ in range(Q):
query = list(map(int, input().split()))
if query[0] == 1:
bt.add(query[1])
else:
ans = bt[k - 1]
if ans is None:
print(-1)
else:
print(ans)
bt.remove(ans)