#include <iostream>
using namespace std;
int Heap[ 1000002 ]; //最小堆
int size;
void siftDown(int s)
{
int minOne = 2 * s;
while(minOne <= size)
{
if(minOne + 1 <= size && Heap[ minOne ] > Heap[ minOne + 1 ])
{
minOne ++;
}
if(Heap[ minOne ] >= Heap[ s ])
{
break;
}
else
{
swap(Heap[ minOne ], Heap[ s ]);
s = minOne;
minOne = 2 * s;
}
}
}
void siftUp(int s)
{
int minOne = s / 2;
while(minOne >= 1)
{
if(Heap[ s ] >= Heap[ minOne ])
{
break;
}
else
{
swap(Heap[ s ], Heap[ minOne ]);
s = minOne;
minOne /= 2;
}
}
}
void buildHeap()
{
for(int i = size; i >= 1; i --)
{
siftDown(i);
}
}
int main()
{
int n, k, x;
char cmd[ 2 ];
while(scanf("%d %d", &n, &k) != EOF)
{
size = 0;
while(n > 0)
{
scanf("%s", cmd);
if(cmd[ 0 ] == 'I')
{
scanf("%d", &x);
if(size < k)
{
size ++;
Heap[ size ] = x;
if(size == k)
{
buildHeap();
}
}
else
{
if(x > Heap[ 1 ])
{
Heap[ 1 ] = x;
siftDown(1);
}
}
}
else if(cmd[ 0 ] == 'Q')
{
printf("%d\n", Heap[ 1 ]);
}
n --;
}
}
return 0;
}
杭电ACM4006(最小堆)
最新推荐文章于 2019-05-18 22:48:37 发布