Priority Queue๋ฅผ ํตํ ์ค๊ฐ๊ฐ ๊ตฌํ๊ธฐ
- ์ฝ์
ํ ๋๋ง๋ค ์ค์๊ฐ ๊ตฌํ๋ ๋ฌธ์
- ํจ์จ์ ์ผ๋ก ์งํํ๊ธฐ ์ํด Heap์ผ๋ก ๊ตฌ์ฑ๋ Priority Queue ์ด์ฉ
- ์๊ฐ ๋ณต์ก๋ : O(nlogn)
๊ตฌํ ๊ท์น
- ์ ์ผ ์ฒ์ ์ต๋ ํ์ ์ฝ์
- ์ต๋ ํ์ ํฌ๊ธฐ๋ ์ต์ ํ์ ํฌ๊ธฐ์ ๊ฐ๊ฑฐ๋, ํ๋ ๋ ํผ
- ์ต๋ ํ์ ์ต๋ ์์๋ ์ต์ ํ์ ์ต์ ์์๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์
- ์๊ณ ๋ฆฌ์ฆ์ ๋ง์ง ์๋ค๋ฉด ์ต๋ ํ, ์ต์ ํ์ ๊ฐ์ฅ ์์ ๊ฐ swap
- ์ด ๋๊ฐ์ง ๊ท์น์ ์ ์งํด ์ค๋ค๋ฉด ํญ์ ์ต๋ ํ top๊ฐ์ด ์ค๊ฐ๊ฐ
SWEA ์ค๊ฐ๊ฐ ๊ตฌํ๊ธฐ
- ๋งจ ์ฒ์
5
์ฝ์
- ๊ทธ ํ
1, 3
, 2, 6
, 8, 9
์ฐจ๋ก๋๋ก ์ฝ์
์ ์ผ ์ฒ์ ์ต๋ ํ์ ์ฝ์
- ์ต๋ ํ์ ํฌ๊ธฐ๊ฐ ๋ ์ปค์ผํ๊ธฐ ๋๋ฌธ (1๋ฒ ๊ท์น)
max heap min heap
(5)
๋ค์ ์ซ์ ์ฝ์
(์ต์, ์ต๋ ์์ผ๋ก)
max heap min heap
(5) (1)
/
(3)
์ต๋ ํ ๋ฃจํธ๋
ธ๋์ ์ต์ ํ ๋ฃจํธ๋
ธ๋ ๋น๊ต
- ์ต๋ ํ์ ๋ฃจํธ๋
ธ๋๊ฐ ๋ ์์์ผํ๊ธฐ ๋๋ฌธ์ swap (2๋ฒ ๊ท์น)
- ์ด ๋ ์ค๊ฐ๊ฐ :
3
max heap min heap
(3) (5)
/
(1)
๋ค์ ์ซ์ ์ฝ์
(์ต์, ์ต๋ ์์ผ๋ก)
max heap min heap
(6) (2)
/ \ /
(3) (1) (5)
์ต๋ ํ ๋ฃจํธ๋
ธ๋์ ์ต์ ํ ๋ฃจํธ๋
ธ๋ ๋น๊ต
- ์ต๋ ํ์ ๋ฃจํธ๋
ธ๋๊ฐ ๋ ์์์ผํ๊ธฐ ๋๋ฌธ์ swap (2๋ฒ ๊ท์น)
- ์ด ๋ ์ค๊ฐ๊ฐ :
3
max heap min heap
(3) (5)
/ \ /
(2) (1) (6)
๋ค์ ์ซ์ ์ฝ์
(์ต์, ์ต๋ ์์ผ๋ก)
max heap min heap
(9) (5)
/ \ / \
(3) (2) (6) (8)
/
(1)
์ต๋ ํ ๋ฃจํธ๋
ธ๋์ ์ต์ ํ ๋ฃจํธ๋
ธ๋ ๋น๊ต
- ์ต๋ ํ์ ๋ฃจํธ๋
ธ๋๊ฐ ๋ ์์์ผํ๊ธฐ ๋๋ฌธ์ swap (2๋ฒ ๊ท์น)
- ์ด ๋ ์ค๊ฐ๊ฐ :
5
max heap min heap
(5) (6)
/ \ / \
(3) (2) (8) (9)
/
(1)
๊ตฌํ ์๊ณ ๋ฆฌ์ฆ
import java.io.*;
import java.util.*;
public class ์ค๊ฐ๊ฐ๊ตฌํ๊ธฐ {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder sb = new StringBuilder();
int T = Integer.parseInt(br.readLine());
for(int t = 1; t <= T; t++) {
sb.append("#"+t+" ");
st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Collections.reverseOrder());
PriorityQueue<Integer> minHeap = new PriorityQueue<>();
maxHeap.add(Integer.parseInt(st.nextToken()));
long sum = 0;
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
minHeap.add(Integer.parseInt(st.nextToken()));
maxHeap.add(Integer.parseInt(st.nextToken()));
if(minHeap.peek() < maxHeap.peek()) {
int min = minHeap.poll(), max = maxHeap.poll();
minHeap.add(max);
maxHeap.add(min);
}
sum += maxHeap.peek();
}
sb.append(sum%20171109 + "\n");
}
System.out.println(sb);
}
}