티스토리 뷰

 

총 N개의 입력이 들어오고 매번 입력마다 중간값을 출력하는 문제다

N이 최대 10만이기 때문에 N^2은 불가능하다!

 

자료구조 힙을 사용하면 된다

중간만 보기때문에 중간을 기준으로 양쪽을 힙으로 잘랐다고 생각하자

 

계속 첫번째 힙에 숫자를 넣어주고 만약 짝수번째 순서면 두번째 힙으로 넘겨주자

 

그리고 처리할게 하나 있는데 첫번째힙의 탑과 두번째 힙의 탑을 비교해서 

첫번째 힙에 작은수가 들어갈 수 있게 해야한다

그럼 첫번째 힙의  top이 계속 답이된다!

 

참고로 첫번째는 max힙, 두번째는 min힙이다

 

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
int n;
int main() {
    scanf(" %d"&n);
    priority_queue<int> pq1, pq2;
    for (int i = 0; i < n; i++) {
        int x; scanf(" %d"&x); 
        pq1.push(x);
        if (i & 1) {
            pq2.push(-pq1.top()); pq1.pop();
        }
        
        if (!pq1.empty() && !pq2.empty()) {
            int a = pq1.top();
            int b = -pq2.top();
            if (a > b) {
                pq1.pop(); pq1.push(b);
                pq2.pop(); pq2.push(-a);
            }
        }
        printf("%d\n"pq1.top());
    }
}
 
 

'알고리즘 > BOJ' 카테고리의 다른 글

[백준] 2502 떡 먹는 호랑이  (1) 2020.02.04
[백준] 2590 색종이  (0) 2020.02.04
[백준] 16917 양념 반 후라이드 반  (0) 2020.02.02
[백준] 16988 Baaaaaaaaaduk2 (Easy)  (0) 2020.02.02
[백준] 17071 숨바꼭질 5  (0) 2020.02.02
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함