zoukankan      html  css  js  c++  java
  • 洛谷 P3378 【模板】堆

    我终于会堆!了!

    然后稍微科普一下stl哦~

    在queue里面有一个叫做priority_queue(优先队列)

    初始化状态为大根堆,经过这样的操作可以变为小根堆:

     priority_queue <int,vector<int>,greater<int> >q; 

    需要注意的是在greater<int>(该括号与后面那个括号不能够连在一起,否则会报错,因为"<<"构成了位运算!)

    或者可以不这样做,直接用原版

     priority_queue <int>q; 

    但是需要再加入元素的时候进行这样操作

     q.push(-x); 

    以及

     -q.front(); 

    什么的,详细的嘛,请出门右拐直达度娘~

    题目描述

    如题,初始小根堆为空,我们需要支持以下3种操作:

    操作1: 1 x 表示将x插入到堆中

    操作2: 2 输出该小根堆内的最小数

    操作3: 3 删除该小根堆内的最小数

    输入输出格式

    输入格式:

    第一行包含一个整数N,表示操作的个数

    接下来N行,每行包含1个或2个正整数,表示三种操作,格式如下:

    操作1: 1 x

    操作2: 2

    操作3: 3

    输出格式:

    包含若干行正整数,每行依次对应一个操作2的结果。

    输入输出样例

    输入样例#1:
    5
    1 2
    1 5
    2
    3
    2
    输出样例#1:
    2
    5

    说明

    时空限制:1000ms,128M

    数据规模:

    对于30%的数据:N<=15

    对于70%的数据:N<=10000

    对于100%的数据:N<=1000000(注意是6个0。。。不过不要害怕,经过编者实测,堆是可以AC的)

    样例说明:

    故输出为2、5

    代码:

    #include <iostream>
    #include <cmath>
    using namespace std;
    
    const int N = 1000010;
    int n,len;
    int d[N<<1];
    
    void add(int x) {
        //将最小的存在 d【1】中
        int now,next;
        d[++len]=x;
        now=len;
        while(now>1) {
            next=now>>1;
            if(d[now]>=d[next]) break;
            swap(d[now],d[next]);
            now=next;
        }
    }
    
    void print() {
        //输出最小值
        cout<<d[1]<<endl;
    }
    
    void del() {
        int now,next,root;
        root=d[1];
        d[1]=d[len--];
        now=1;
        while((now<<1)<=len) {
            next=now<<1;
            if(next<len && d[next+1]<d[next]) next++;
            if(d[now]<=d[next]) return;
            swap(d[now],d[next]);
            now=next;
        }
    }
    
    int main() {
        cin.sync_with_stdio(false);
        cin>>n;
        for(int i=1,c; i<=n; i++) {
            cin>>c;
            if(c==1) {
                int q;
                cin>>q;
                add(q);
            } else if(c==2) print();
            else del();
        }
        return 0;
    }

    如果运气好也是错,那我倒愿意错上加错!

    ❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀

  • 相关阅读:
    李宏毅机器学习课程笔记-6.1神经网络训练问题与解决方案
    PAT甲级1055The World's Richest
    PAT甲级1028List Sorting
    PAT甲级1025PAT Ranking
    PAT甲级1016Phone Bills
    五边形数
    组合计数
    [编程题] lc三数之和 (借助哈希表)
    [编程题] 基础:如何使用大顶堆和小顶堆找topN
    [编程题] lc [剑指 Offer 54二叉搜索树的第k大节点----或者是求第K小元素]
  • 原文地址:https://www.cnblogs.com/zxqxwnngztxx/p/6652708.html
Copyright © 2011-2022 走看看