栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > C/C++/C#

数组模拟堆

C/C++/C# 更新时间:发布时间: 百科书网 趣学号

I x,插入一个数 x;
PM,输出当前集合中的最小值;
DM,删除当前集合中的最小值(数据保证此时的最小值唯一);
D k,删除第 k 个插入的数;
C k x,修改第 k 个插入的数,将其变为 x ;

#include
#include
using namespace std;

const int N=1e5+5;
int n,sz,ct;
int h[N],cnt[N],tm[N];

void heap_swap(int a,int b)
{
    swap(h[a],h[b]);
    swap(cnt[tm[a]],cnt[tm[b]]);
    swap(tm[a],tm[b]);
}

void down(int k)
{
    int t=k;
    if(2*t<=sz && h[k]>h[2*t]) k=2*t;
    if(2*t+1<=sz && h[k]>h[2*t+1]) k=2*t+1;
    if(t!=k)
    {
        heap_swap(t,k);
        down(k);
    }
}

void up(int k)
{
    int t=k;
    if(t/2>=1 && h[k]>n;
    while(n--)
    {
        string ch;
        int k,x;
        cin>>ch;
        if(ch=="I")
        {
            cin>>x;
            insert(x);
        }
        if(ch=="PM") cout<>k;
            k=cnt[k];
            heap_swap(k,sz);
            sz--;
            down(k);
            up(k);
        }
        if(ch=="C")
        {
            cin>>k>>x;
            k=cnt[k];
            h[k]=x;
            down(k);
            up(k);
        }
    }
    return 0;
}
转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/743395.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号