結果
| 問題 |
No.3167 [Cherry 7th Tune C] Cut in Queue
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-10-28 02:04:11 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 2,405 ms / 2,500 ms |
| コード長 | 3,365 bytes |
| コンパイル時間 | 273 ms |
| コンパイル使用メモリ | 82,776 KB |
| 実行使用メモリ | 488,828 KB |
| 最終ジャッジ日時 | 2025-10-28 02:05:13 |
| 合計ジャッジ時間 | 54,081 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 43 |
ソースコード
## https://yukicoder.me/problems/no/573
class BinaryIndexTree:
"""
フェニック木(BinaryIndexTree)の基本的な機能を実装したクラス
"""
def __init__(self, size):
self.size = size
self.array = [0] * (size + 1)
def add(self, x, a):
index = x
while index <= self.size:
self.array[index] += a
index += index & (-index)
def sum(self, x):
index = x
ans = 0
while index > 0:
ans += self.array[index]
index -= index & (-index)
return ans
def least_upper_bound(self, value):
if self.sum(self.size) < value:
return -1
elif value <= 0:
return 0
m = 1
while m < self.size:
m *= 2
k = 0
k_sum = 0
while m > 0:
k0 = k + m
if k0 < self.size:
if k_sum + self.array[k0] < value:
k_sum += self.array[k0]
k += m
m //= 2
if k < self.size:
return k + 1
else:
return -1
def main():
N = int(input())
A = list(map(int, input().split()))
Q = int(input())
queries = []
for _ in range(Q):
values = tuple(map(int, input().split()))
queries.append(values)
# 連結リストを作る
a_map = {}
prev = None
for a in A:
node = {
"value": a,
"prev": None,
"next": None
}
a_map[a] = node
if prev is not None:
prev["next"] = node
node["prev"] = prev
prev = node
tail = prev
k = 1
for values in queries:
if values[0] == 1:
_, a = values
b = N + k
node = {
"value": b,
"prev": None,
"next": None
}
a_map[b] = node
if a == 0:
tail["next"] = node
node["prev"] = tail
tail = node
else:
next_node = a_map[a]
prev_node = next_node["prev"]
node["next"] = next_node
next_node["prev"] = node
if prev_node is not None:
prev_node["next"] = node
node["prev"] = prev_node
k += 1
# headを探す
head_node = None
for node in a_map.values():
if node["prev"] is None:
head_node = node
break
node = head_node
array = []
position_map = {}
while node is not None:
position_map[node["value"]] = len(array)
array.append(node["value"])
node = node["next"]
# bit
bit = BinaryIndexTree(N + k + 1)
for i in range(1, N + 1):
bit.add(position_map[i] + 1, 1)
k = N + 1
for values in queries:
if values[0] == 1:
_, a = values
x = position_map[k]
bit.add(x + 1, 1)
k += 1
elif values[0] == 2:
y = bit.least_upper_bound(1)
bit.add(y, -1)
elif values[0] == 3:
_, l = values
z = bit.least_upper_bound(l)
print(array[z - 1])
if __name__ == '__main__':
main()