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;
    }
    如果你够坚强够勇敢,你就能驾驭他们
  • 相关阅读:
    C++ 将对象写入文件 并读取
    IronPython fail to add reference to WebDriver.dll
    How to Capture and Decrypt Lync Server 2010 TLS Traffic Using Microsoft Tools
    .net code injection
    数学系学生应该知道的十个学术网站
    Difference Between Currency Swap and FX Swap
    Swift开源parser
    谈谈我对证券公司一些部门的理解(前、中、后台)[z]
    JDK8记FullGC时候Metaspace内存不会被垃圾回收
    JVM源码分析之JDK8下的僵尸(无法回收)类加载器[z]
  • 原文地址:https://www.cnblogs.com/liuzhaojun/p/11295190.html
Copyright © 2011-2022 走看看