首页 > 其他 > 详细

洛谷P3378 【模板】堆 题解 堆(Heap)入门题

时间:2020-03-01 00:31:22      阅读:73      评论:0      收藏:0      [点我收藏+]

题目链接:https://www.luogu.com.cn/problem/P3378

题目大意:维护一个小根堆。

堆的入门题。

实现代码如下:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1000010;
int tree[maxn], n, sz, op, x;
void up(int x) {
    while (x != 1 && tree[x] < tree[x/2]) {
        swap(tree[x], tree[x/2]);
        x /= 2;
    }
}
void Insert(int num) {
    tree[++sz] = num;
    up(sz);
}
void down(int x) {
    while (x <= sz) {
        int son = -1;
        if (x*2+1 <= sz && min(tree[x*2], tree[x*2+1]) < tree[x]) {
            if (tree[x*2] <= tree[x*2+1]) son = x*2;
            else son = x*2+1;
        }
        else if (x*2 <= sz && tree[x*2] < tree[x]) {
            son = x*2;
        }
        if (son != -1) {
            swap(tree[x], tree[son]);
            x = son;
        }
        else break;
    }
}
void Delete() {
    tree[1] = tree[sz--];
    down(1);
}
int main() {
    cin >> n;
    while (n --) {
        cin >> op;
        if (op == 1) {
            cin >> x;
            Insert(x);
        }
        else if (op == 2) cout << tree[1] << endl;
        else Delete();
    }
    return 0;
}

洛谷P3378 【模板】堆 题解 堆(Heap)入门题

原文:https://www.cnblogs.com/quanjun/p/12387413.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!