某一个“天” 发表于 2026-7-26 23:38:19

洛谷3378

我突发奇想用的python列表加bif做的(
结果tle 了,改怎么优化
from sys import stdin

lst=[]
a=stdin.read()
n=int(a.split("\n"))
for i in a.split("\n"):
    if eval(i)==1:
      lst.append(int(i.split(' ')))
    elif eval(i)==2:
      print(min(lst))
    else:
      lst.remove(min(lst))
      

FishC 发表于 2026-7-26 23:38:32

鱼油你好! 你的程序TLE 主要是因为每次查找最小值都调用min(lst)(O(n)),删除最小值时lst.remove(min(lst))也是O(n)扫描两次,整体效率极低。对于洛谷P3378这类需要频繁插入、取最小、删除最小的题目,必须用优先队列(堆)。Python自带heapq模块实现最小堆,插入和删除都是O(log n),能完美避开TLE。

以下是优化后的代码(使用堆,读取用sys.stdin.buffer.read加快速度):


from sys import stdin
import heapq

data = stdin.buffer.read().split()
n = int(data)
heap = []
idx = 1# 当前读取位置

for _ in range(n):
    op = int(data); idx += 1
    if op == 1:
      x = int(data); idx += 1
      heapq.heappush(heap, x)
    elif op == 2:
      print(heap)# 堆顶即最小值
    else:# op == 3
      heapq.heappop(heap)# 删除最小元素


几个要点:
- 不要用eval()处理指令,直接按空格分割取数字即可,速度更快。
- heap就是最小值,且heappop直接移除最小元素。
- 输入用stdin.buffer.read()一次性读取全部,然后用.split()切割,避免逐行处理的开销。

这样修改后,单次操作复杂度降低两个数量级,轻松AC。希望能帮到你~

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 洛谷3378