模拟堆

维护一个集合,初始时集合为空,支持如下几种操作:

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

现在要进行 N

次操作,对于所有第 2

个操作,输出当前集合的最小值。

输入格式

第一行包含整数 N

接下来 N

行,每行包含一个操作指令,操作指令为 I xPMDMD kC k x 中的一种。

输出格式

对于每个输出指令 PM,输出一个结果,表示当前集合中的最小值。

每个结果占一行。

数据范围

1N105


109x109


数据保证合法。

输入样例:

8
I -10
PM
I -10
D 1
C 2 8
I 6
PM
DM

输出样例:

-10
6
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int h[N], ph[N], hp[N], hize, how, n;// h为模拟的堆,ph为插入时间与位置的映射,
                                    //hp为位置与插入时间的映射, hize为heap大小,how为插入下标
void hwap(int a, int b) // 由于要维护hp和ph故要再写一个swap
{
    // 传导进来的为两数在heap中的位置
    swap(ph[hp[a]], ph[hp[b]]);
    swap(hp[a], hp[b]);
    swap(h[a], h[b]);// 将三个数分别进行交换
}
void down(int u)
{
    int t = u; // 用中间变量保存,实现父节点和左右子节点之间的相互比较
    if(u*2 <= hize && h[u*2] < h[t]) t = u*2;
    if(u*2+1 <= hize && h[u*2+1] < h[t]) t = u*2+1;
    if(u != t)
    {
        hwap(u, t);
        down(t);
    }
}
void up(int u)
{
    while(u/2 && h[u/2] > h[u])
    {
        hwap(u/2, u);
        u /= 2;
    }
}
int main()
{
    scanf("%d", &n);
    while(n -- )
    {
        char op[10];
        scanf("%s", op);
        if(!strcmp(op, "I"))
        {
            int a;
            scanf("%d", &a);
            h[++hize] = a;
            hp[hize] = ++ how;
            ph[how] = hize;
            up(hize);
         }
        else if(!strcmp(op, "PM")) printf("%d\n", h[1]);
        else if(!strcmp(op, "DM"))
        {
            hwap(hize, 1);
            hize -- ; // 这里注意要先减hize然后再down
            down(1);
        }
        else if(!strcmp(op, "D"))
        {
            int a, k;
            scanf("%d", &a);
            k = ph[a];
            hwap(ph[a], hize);
            hize -- ;
            down(k), up(k);
        }
        else if(!strcmp(op, "C"))
        {
            int k, x;
            scanf("%d%d", &k, &x);
            h[ph[k]] = x;
            up(ph[k]), down(ph[k]);
        }

    }


    return 0;
}

 

posted @ 2022-08-24 17:08  ginkgozyf  阅读(33)  评论(0)    收藏  举报