반응형
우선순위 큐와 힙 - 변화하는 중간 값
문제출저 - 알고스팟 https://algospot.com/judge/problem/read/RUNNINGMEDIAN
answer code
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int MOD = 20090711;
int n;
struct RNG {
int seed, a, b;
RNG(int _a, int _b) : a(_a), b(_b), seed(1983) {}
int next() {
int ret = seed;
seed = ((seed * (long long)a) + b) % MOD;
return ret;
}
};
int func(RNG rng) {
priority_queue<int, vector<int>, less<int>> maxHeap;
priority_queue<int, vector<int>, greater<int>> minHeap;
int ret = 0;
// maxHeap = 앞의 절반
// minHeap = 뒤의 절반
// 홀수이면 최대 힙에 숫자 하나 더
// maxHeap의 크기는 minHeap의 크기와 같거나 1 더 크다
// maxHeap.top() <= minHeap.top()
for (int i = 1; i <= n; ++i) {
if (maxHeap.size() == minHeap.size()) {
maxHeap.push(rng.next());
}
else {
minHeap.push(rng.next());
}
// 최대 힙의 원소는 최소 힙의 최소 원소보다 클수가 없다. 복구
if (!minHeap.empty() && !maxHeap.empty() &&
minHeap.top() < maxHeap.top()) {
int a = maxHeap.top(), b = minHeap.top();
maxHeap.pop();
minHeap.pop();
maxHeap.push(b);
minHeap.push(a);
}
ret = (ret + maxHeap.top()) % MOD;
}
return ret;
}
int main() {
cin.sync_with_stdio(false);
int T, a, b;
cin >> T;
while (T--) {
cin >> n >> a >> b;
RNG rng(a,b);
cout << func(rng) << "\n";
}
}
|
cs |
반응형
'IT > Algorithm' 카테고리의 다른 글
그래프 - (백준 1260, 2606, 2667) DFS와 BFS, 바이러스, 단지번호붙이기 (2) | 2020.08.28 |
---|---|
그래프 (DFS, BFS) (0) | 2020.08.28 |
이진 검색 트리 (0) | 2020.08.23 |
트리 - 트리 순회 순서 변경 (0) | 2020.08.22 |
스택 - 짝이 맞지 않는 괄호 (0) | 2020.08.20 |
댓글