P3378 【模板】堆 优先队列/最小堆
题目理解
P3378 【模板】堆 是一道 堆(优先队列) 的模板题,要求实现以下三种操作:
-
插入操作:将给定整数
x加入数列。 -
查询操作:输出当前数列中的最小值。
-
删除操作:删除数列中的最小值(若有多个相同最小值,只删除一个)。
解题思路
-
数据结构选择
-
使用 小根堆(Min-Heap) 来维护数列,保证堆顶始终是最小值。
-
C++ 的
priority_queue默认是大根堆,可以通过greater<int>改为小根堆。
-
-
操作实现
-
插入(op=1):直接调用
q.push(x)。 -
查询最小值(op=2):返回
q.top()。 -
删除最小值(op=3):调用
q.pop()。
-
-
时间复杂度分析
-
插入、删除、查询操作均为 O(logn),其中 n 是堆中元素个数。
-
题目 n≤10^6,完全可以通过。
-
#include<bits/stdc++.h> using namespace std; int main() { int n; // 定义小根堆(优先队列,greater<int> 使堆顶为最小值) priority_queue<int, vector<int>, greater<int>> q; cin >> n; // 输入操作次数 while(n--) { int op, x; cin >> op; // 输入操作类型 if(op == 1) { // 插入操作 cin >> x; q.push(x); // 将 x 加入堆 } else if(op == 2) { // 查询最小值操作 cout << q.top() << endl; // 输出堆顶(最小值) } else if(op == 3) { // 删除最小值操作 q.pop(); // 删除堆顶(最小值) } } return 0; }

浙公网安备 33010602011771号