반응형
문제 : https://www.acmicpc.net/problem/1927
서론
11279번 문제인 최대 힙을 변형했다.
구현
최대 힙과 다른점은
힙을 비교하는 영역들의 부등호를 돌려주면 된다.
그리고 힙을 제거할때 마지막 힙을 루트로 올린 후 마지막 힙을 0이 아닌 최대값으로 저장해줘야 힙을 비교할때 0을 최소값으로 인식하는걸 막을 수 있다. (라인32)
// c++
// min heap
#pragma warning (disable:4996)
#include <cstring>
#include <iostream>
#include <cstdio>
typedef struct pq {
int heap[100003] = { 0, };
int index = 0;
}pq;
void push(pq *q, int item) {
q->index++;
q->heap[q->index] = item;
int index = q->index;
while (q->heap[index] < q->heap[index / 2]) {
if (index == 1) break;
int tmp = q->heap[index];
q->heap[index] = q->heap[index / 2];
q->heap[index / 2] = tmp;
index /= 2;
}
}
void pop(pq *q) {
if (q->index == 0) return;
q->heap[1] = q->heap[q->index];
q->heap[q->index] = 0x3f3f3f3f;
q->index--;
int index = 1;
while (index * 2 <= q->index) {
int nextIndex = 0;
if (q->heap[index * 2] < q->heap[index * 2 + 1]) nextIndex = index * 2;
else nextIndex = index * 2 + 1;
if (q->heap[nextIndex] < q->heap[index]) {
int tmp = q->heap[index];
q->heap[index] = q->heap[nextIndex];
q->heap[nextIndex] = tmp;
index = nextIndex;
}
else break;
}
}
int top(pq *q) {
if (q->index == 0) return 0;
else return q->heap[1];
}
int main() {
pq q;
//memset(q.heap, 0x3f, sizeof(q.heap));
int n;
std::cin >> n;
while (n--) {
int x;
//std::cin >> x;
scanf("%d", &x);
if (x == 0) {
//std::cout << top(&q) << std::endl;
printf("%d\n", top(&q));
pop(&q);
}
else push(&q, x);
}
}
최근댓글