22067: 快速堆猪
辅助栈, http://cs101.openjudge.cn/practice/22067/
小明有很多猪,他喜欢玩叠猪游戏,就是将猪一头头叠起来。猪叠上去后,还可以把顶上的猪拿下来。小明知道每头猪的重量,而且他还随时想知道叠在那里的猪最轻的是多少斤。
输入
有三种输入
- push n n是整数(0<=0 <=20000),表示叠上一头重量是n斤的新猪
- pop 表示将猪堆顶的猪赶走。如果猪堆没猪,就啥也不干
- min 表示问现在猪堆里最轻的猪多重。如果猪堆没猪,就啥也不干
输入总数不超过100000条
输出
对每个min输入,输出答案。如果猪堆没猪,就啥也不干
样例输入
pop
min
push 5
push 2
push 3
min
push 4
min样例输出
2
2来源: Guo wei
用辅助栈:用一个单调栈维护最小值,再用另外一个栈维护其余的值。
每次push时,在辅助栈中加入当前最轻的猪的体重,pop时也同步pop,这样栈顶始终是当前猪堆中最轻的体重,查询时直接输出即可
python
a = []
m = []
while True:
try:
s = input().split()
if s[0] == "pop":
if a:
a.pop()
if m:
m.pop()
elif s[0] == "min":
if m:
print(m[-1])
else:
h = int(s[1])
a.append(h)
if not m:
m.append(h)
else:
k = m[-1]
m.append(min(k, h))
except EOFError:
breakpython
pig, pigmin = [], []
while True:
try:
*line, = input().split()
if "pop" in line:
if len(pig) == 0:
continue
val = pig.pop()
if len(pigmin) > 0 and val == pigmin[-1]:
pigmin.pop()
elif "push" in line:
val = int(line[1])
pig.append(val)
if len(pigmin) == 0 or val <= pigmin[-1]:
pigmin.append(val)
elif "min" in line:
if len(pig) == 0:
continue
else:
print(pigmin[-1])
except EOFError:
break字典标记,懒删除
python
import heapq
from collections import defaultdict
out = defaultdict(int)
pigs_heap = []
pigs_stack = []
while True:
try:
s = input()
except EOFError:
break
if s == "pop":
if pigs_stack:
out[pigs_stack.pop()] += 1
elif s == "min":
if pigs_stack:
while True:
x = heapq.heappop(pigs_heap)
if not out[x]:
heapq.heappush(pigs_heap, x)
print(x)
break
out[x] -= 1
else:
y = int(s.split()[1])
pigs_stack.append(y)
heapq.heappush(pigs_heap, y)集合标记,懒删除。如果有重复项就麻烦了,可能刚好赶上题目数据友好。
python
import heapq
class PigStack:
def __init__(self):
self.stack = []
self.min_heap = []
self.popped = set()
def push(self, weight):
self.stack.append(weight)
heapq.heappush(self.min_heap, weight)
def pop(self):
if self.stack:
weight = self.stack.pop()
self.popped.add(weight)
def min(self):
while self.min_heap and self.min_heap[0] in self.popped:
self.popped.remove(heapq.heappop(self.min_heap))
if self.min_heap:
return self.min_heap[0]
else:
return None
pig_stack = PigStack()
while True:
try:
command = input().split()
if command[0] == 'push':
pig_stack.push(int(command[1]))
elif command[0] == 'pop':
pig_stack.pop()
elif command[0] == 'min':
min_weight = pig_stack.min()
if min_weight is not None:
print(min_weight)
except EOFError:
break