P3378 【模板】堆 优先队列/最小堆

题目理解

P3378 【模板】堆 是一道 堆(优先队列) 的模板题,要求实现以下三种操作:

  1. 插入操作:将给定整数 x 加入数列。

  2. 查询操作:输出当前数列中的最小值。

  3. 删除操作:删除数列中的最小值(若有多个相同最小值,只删除一个)。

解题思路

  1. 数据结构选择

    • 使用 小根堆(Min-Heap) 来维护数列,保证堆顶始终是最小值。

    • C++ 的 priority_queue 默认是大根堆,可以通过 greater<int> 改为小根堆。

  2. 操作实现

    • 插入(op=1):直接调用 q.push(x)

    • 查询最小值(op=2):返回 q.top()

    • 删除最小值(op=3):调用 q.pop()

  3. 时间复杂度分析

    • 插入、删除、查询操作均为 O(logn),其中 n 是堆中元素个数。

    • 题目 n10^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;
}

 


代码注释

posted @ 2025-05-30 15:56  CRt0729  阅读(20)  评论(0)    收藏  举报