Algorithm/문제풀이
[C++] 백준 알고리즘 11268번 절댓값 힙
사과당근
2021. 9. 20. 10:24
이 문제를 풀기 위해
음수 힙과 양수 힙, 두개를 선언했다.
최소 힙 두개를 만들었는데,
priority_queue<int,vector<int>, greater<int>> p;
를 이용하면 최소 힙으로 만들 수 있다.
이 때 vector 는 include 하지 않아도 되고,
push와 pop 같은 연산은
priority_queue<int> p; (최대 힙)
을 이용할 때 처럼
p.pop(); 등 으로 해주면 된다.
#include<iostream>
#include<queue>
using namespace std;
int main() {
//p에는 양수인 것들을 최소 힙으로 저장
//m에는 음수인 것들의 절댓값을 최소 힙으로 저장
priority_queue<int,vector<int>, greater<int>> p;
priority_queue<int, vector<int>, greater<int>> m;
int n;
cin >> n;
int q;
int k;
while (n--) {
cin >> q;
if (q != 0) { //0이 아니면 힙에 넣기
if (q > 0) p.push(q);
else {
k = -q; //양수로 전환해서 힙에 저장
m.push(k);
}
}
else {
if (m.empty() || p.empty()) { //둘 중 한 힙이 비어있을 때
if (m.empty() && p.empty()) { //둘 다 비어있으면 0 출력
cout << 0 << '\n';
}
else if (m.empty()) { //음수 힙이 비어있으면 양수 힙에서 최솟값 출력
cout << p.top() << '\n';
p.pop();
}
else { //양수 힙이 비어있으면 음수 힙 최솟값을 음수로 출력
cout << -m.top() << '\n';
m.pop();
}
}
else if (m.top() <= p.top()) { //최솟값 끼리 비교
cout << -(m.top()) << '\n';
m.pop();
}
else {
cout << p.top() << '\n';
p.pop();
}
}
}
}