zoukankan      html  css  js  c++  java
  • 数据结构--堆

    堆(英语:heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质:
    • 堆中某个节点的值总是不大于或不小于其父节点的值;
    • 堆总是一棵完全二叉树。
    将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆

    P3378 【模板】堆

    题目描述

    如题,初始小根堆为空,我们需要支持以下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的)

    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int inf=1000000;
    int n,a[inf],num=0;
    void swap(int x,int y)
    {
        int temp;
        temp=a[x];
        a[x]=a[y];
        a[y]=temp;
        return ;
    }
    void siftdown(int i)
    {
        int t,flag=0;
        while(i*2<=num&&flag==0)
        {
            if(a[i*2]<a[i])
            {
                t=i*2;
            }
            else
            {
                t=i;
            }
            if(i*2+1<=num)
            {
            if(a[t]>a[i*2+1])
            t=i*2+1;
            }
            if(t!=i)
            {
                swap(t,i);
                i=t;
            }
            else
            flag=1;
        }
        return ;
    }
    int pop()
    {
        int p;
        p=a[1];
        a[1]=a[num];
        num--;
        siftdown(1);
        return p;
    }
    void siftup(int i)
    {
        int flag=0;
        if(i==1)
        return ;
        while(i!=1&&flag==0)
        {
            if(a[i/2]>a[i])
                swap(i,i/2);
            else
            flag=1;
            i=i/2;
        }
        return ;
    }
    int main()
    {
        int op,x;
        cin>>n;
        while(n--)
        {
            cin>>op;
            if(op==1)
            {
                num++;
                cin>>a[num];
                siftup(num);
            }
            if(op==2)
            {
                cout<<a[1]<<endl;
            }
            if(op==3)
            {
                pop();
            }
        }
        return 0;
    }
    如果你够坚强够勇敢,你就能驾驭他们
  • 相关阅读:
    DFT
    BSDL
    穆尼里奥:未派上最好点球手;齐达内成功并不意外
    module使用和设置
    APU (美国AMD公司研发的加速处理器)
    Lucio: We avoided Mourinho after every loss
    高位压迫——萨基给世界足坛带来的技术革命
    穆里尼奥:曼联没有在今夏尝试过签下C罗
    Linux 的 Out-of-Memory (OOM) Killer
    shell source命令说明
  • 原文地址:https://www.cnblogs.com/liuzhaojun/p/11295190.html
Copyright © 2011-2022 走看看