크기 루트 힙
down
와 의 up
두 파일의 상단을 유지하는 것으로 충분합니다.
n개의 요소를 삽입하는 복잡도는 O(nlogn)이지만 n개의 요소를 힙에 구축하는 시간 복잡도는 O(n)입니다.힙을 구축하는 코드는 다음과 같습니다.
for(int i = n/2;i >=1 ;i --) down(i);
코드
#include <bits/stdc++.h>
using namespace std;
class pile
{
private:
int a[(int)1e6 + 5];
int size;
public:
int top()
{
return a[1];
}
void pop()
{
a[1] = a[size--];
down(1);
}
void down(int i)
{
int t = i;
if (i * 2 <= size && a[i] > a[i * 2])
t = i * 2;
if (i * 2 + 1 <= size && a[t] > a[i * 2 + 1])
t = i * 2 + 1;
if (t != i)
{
swap(a[t], a[i]);
down(t);
}
}
void up(int i)
{
while (i / 2 && a[i] < a[i / 2])
swap(a[i], a[i / 2]), i /= 2;
}
void insert(int x)
{
a[++size] = x;
up(size);
}
};
int main()
{
pile q;
int n;
cin >> n;
for (int i = 1; i <= n; i++)
{
int opt;
cin >> opt;
if (opt == 1)
{
cin >> opt;
q.insert(opt);
}
else if (opt == 2)
cout << q.top() << endl;
else
q.pop();
}
return 0;
}