문제 링크: https://www.acmicpc.net/problem/1655
재밌는 문제입니다. 힙을 두 개 쓰면 됩니다.
max heap, min heap을 만든 다음 아래 두 조건을 만족하게 하면 항상 max heap의 top이 중간값(median)이 됩니다.
- 1. max heap의 원소 개수는 min heap과 같거나 min heap보다 1 커야 한다
- 2. max heap의 모든 값은 min heap의 모든 값보다 작거나 같아야 한다
#pragma GCC optimize ("Ofast")
#define _CRT_SECURE_NO_WARNINGS
#define _SILENCE_CXX17_C_HEADER_DEPRECATION_WARNING
#include <bits/stdc++.h>
using namespace std;
int main()
{
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
#endif
ios_base::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
priority_queue<int> max_heap;
priority_queue<int, vector<int>, greater<int>> min_heap;
int n;
cin >> n;
while (n--) {
int in;
cin >> in;
if (max_heap.size() == min_heap.size())
max_heap.push(in);
else
min_heap.push(in);
// max heap <= min_heap 만족하는지 체크
if (!max_heap.empty() && !min_heap.empty() && max_heap.top() > min_heap.top()) {
auto a = max_heap.top(), b = min_heap.top();
max_heap.pop(), min_heap.pop();
max_heap.push(b), min_heap.push(a);
}
cout << max_heap.top() << '\n';
}
return 0;
}
2번 조건이 만족되지 않을 때마다 각 힙의 top을 빼서 교체해주면 됩니다
반응형
'Online Judge > 백준' 카테고리의 다른 글
[백준][C++] 12837: 가계부 (Hard) (0) | 2020.08.18 |
---|---|
[백준][C++] 1236: 성 지키기 (0) | 2020.08.17 |
[백준][C++] 14438: 수열과 쿼리 17 (0) | 2020.08.15 |
[백준][C++] 1275: 커피숍2 (0) | 2020.08.14 |
[백준][C++] 1094: 막대기 (0) | 2020.08.13 |