반응형
https://www.acmicpc.net/problem/1572
1572번: 중앙값
중앙값이란, 수열을 정렬했고, 그 크기가 N일 때, 1부터 시작해서 (N+1)/2번째 있는 원소가 그 수열의 중앙값이다. 예를 들어, {1, 2, 6, 5, 4, 3}에서는 3이고, {11, 13, 12, 15, 14}에서는 13이다. 오세준은 1
www.acmicpc.net
[ 문제풀이 ]
이 문제를 풀기 전에 다음 글을 먼저 읽고 오시는 것을 추천드립니다.
https://rudalsd.tistory.com/51
[ 자료구조 ] 세그먼트 트리 (Segment Tree)
1. 세그먼트 트리 (Segment Tree) 먼저, 세그먼트 트리가 무엇인지 알아봅시다! 세그먼트 트리는 구간 합을 저장하기 위한 트리입니다. 예를 들어 size가 5인 배열이 있다고 생각해봅시다. int arr [5] = {1
rudalsd.tistory.com
1. 초기에 Segment Tree를 초기화해주는 대신 트리를 업데이트해주는 함수만을 통해 K 시간 동안 값들을 업데이트하고, 그중 중앙값을 ans에 더해줍니다.
2. K 시간 이후에는 i 초의 값을 세그먼트 트리에 넣어주고, i - K초의 값을 세그먼트 트리에서 빼줍니다.
3. 이후 중앙값을 ans에 더해주고, 마지막에 ans를 출력합니다.
[ 소스코드 ]
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 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | #include<iostream> #define ll long long using namespace std; int N, K; int segTree[262222]; int arr[250000]; ll ans; void plusTree(int node, int s, int e, int num) { if (s > num || e < num) return; segTree[node]++; if (s != e) { int m = (s + e) / 2; plusTree(node * 2, s, m, num); plusTree(node * 2 + 1, m + 1, e, num); } } void minusTree(int node, int s, int e, int num) { if (s > num || e < num) return; segTree[node]--; if (s != e) { int m = (s + e) / 2; minusTree(node * 2, s, m, num); minusTree(node * 2 + 1, m + 1, e, num); } } void getTree(int node, int s, int e, int cnt) { if (s == e) { ans += s; return; } int m = (s + e) / 2; if (segTree[node * 2] >= cnt) { getTree(node * 2, s, m, cnt); } else { getTree(node * 2 + 1, m + 1, e, cnt - segTree[node * 2]); } } int main() { scanf("%d %d", &N, &K); int Max = 0; int Min = 66666; for (int i = 0; i < N; i++) { scanf("%d", &arr[i]); Max = max(Max, arr[i]); Min = min(Min, arr[i]); } for (int i = 0; i < K; i++) { plusTree(1, Min, Max, arr[i]); } getTree(1, Min, Max, (K + 1) / 2); for (int i = K; i < N; i++) { plusTree(1, Min, Max, arr[i]); minusTree(1, Min, Max, arr[i-K]); getTree(1, Min, Max, (K + 1) / 2); } printf("%lld", ans); } | cs |
반응형
'백준' 카테고리의 다른 글
[ 백준 ] 1395번 - 스위치 (C++) (0) | 2023.05.03 |
---|---|
[ 백준 ] 9426번 - 중앙값 측정 (C++) (0) | 2023.05.02 |
[ 백준 ] 4195번 - 친구 네트워크 (C++) (0) | 2023.04.30 |
[ 백준 ] 25545번 - MMST (C++) (0) | 2023.04.29 |
[ 백준 ] 10836번 - 여왕벌 (C++) (0) | 2023.04.28 |