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;
    }
    如果你够坚强够勇敢,你就能驾驭他们
  • 相关阅读:
    flock对文件锁定读写操作的问题 简单
    hdu 2899 Strange Fuction(二分)
    hdu 2199 Can you solve this equation? (二分)
    poj 3080 Blue Jeans (KMP)
    poj 2823 Sliding Window (单调队列)
    poj 2001 Shortest Prefixes (trie)
    poj 2503 Babelfish (trie)
    poj 1936 All in All
    hdu 3507 Print Article (DP, Monotone Queue)
    fzu 1894 志愿者选拔 (单调队列)
  • 原文地址:https://www.cnblogs.com/liuzhaojun/p/11295190.html
Copyright © 2011-2022 走看看