$\newcommand{\O}{\mathrm{O}}$

優先度付きキューと呼ばれる挿入, 削除からなるクエリに対して効率よく最大値を返すデータ構造の実装である.
以下では二分ヒープを用いて実装している. 詳しい実装については他のサイトを参照されたい.
ちなみに python には heapq というライブラリがあり, そっちを使ったほうが速く計算できる.
時間計算量: 挿入, 削除 $\O (\log n)$, 最大値の参照 $\O (1)$
class PriorityQueue:
def __init__(self, max_size):
self.array = [0]*max_size
self.size = 0
def size(self):
return self.size
def empty(self):
return self.size == 0
def push(self, data):
self.array[self.size] = data
index = self.size
while index != 0 and self.array[index] > self.array[(index-1)//2]:
self.array[index], self.array[(index-1)//2] = self.array[(index-1)//2], self.array[index]
index = (index-1)//2
self.size += 1
def top(self):
return self.array[0]
def pop(self):
self.size -= 1
self.array[0], self.array[self.size] = self.array[self.size], self.array[0]
index = 0
while 2*index+1 < self.size:
if 2*index+2 < self.size:
if self.array[2*index+2] > self.array[index] and self.array[2*index+2] >= self.array[2*index+1]:
self.array[2*index+2], self.array[index] = self.array[index], self.array[2*index+2]
index = 2*index+2
elif self.array[2*index+1] > self.array[index] and self.array[2*index+1] >= self.array[2*index+2]:
self.array[2*index+1], self.array[index] = self.array[index], self.array[2*index+1]
index = 2*index+1
else:
break
else:
if self.array[2*index+1] > self.array[index]:
self.array[2*index+1], self.array[index] = self.array[index], self.array[2*index+1]
index = 2*index+1
else:
break
AOJ : Priority Queue 提出コード (heapq を用いていないため TLE にはなっているがすべてのクエリに正答している)