문제 링크
- https://atcoder.jp/contests/abc107/tasks/arc101_b
문제 출처
- AtCoder ABC 107 D번
- AtCoder ARC 191 B번
사용 알고리즘
- 펜윅 트리
- 파라메트릭 서치
시간복잡도
- $O(N log N log 10^9)$
풀이
모든 $(l, r)$쌍 $(1 ≤ l ≤ r ≤ N)$에 대해, $m_{l, r}$의 값들을 모아 새로 만든 수열의 중앙값을 찾는 문제입니다.
길이가 $N$인 수열 $A$의 중앙값이 $m$이라면 수열 $A$에는 $x$보다 크거나 같은 수가 $\lceil {\frac{N}{2}} \rceil$개 이상 있어야 하고, $x$는 이 조건을 만족하는 가장 큰 수여야 합니다.
수열 $A$에서 어떤 수 $x$보다 크거나 같은 수를 1로 바꾸고, $x$보다 작은 수를 0으로 바꿔준 새로운 수열 $B$를 생각해봅시다.
만약 수열 $B$의 정답이 1이라면 수열 $A$에서의 정답은 $x$ 이상이고, 수열 $B$의 정답이 0이라면 수열 $A$에서의 정답은 $x$ 미만이 됩니다.
이런 느낌으로, 어떤 수 $x$를 고정시켜서 $m_{l, r} ≥ x$를 만족하는 $(l, r)$쌍의 개수를 세는 문제로 바꿔서 parametric search를 시도할 수 있습니다.
위에서 언급했듯이, $m_{l, r} ≥ x$가 성립하기 위해서는 $x$이상인 수의 개수가 $x$미만인 수의 개수보다 많거나 같아야합니다. $x$이상인 수를 1, $x$미만인 수를 -1로 바꿔주면, $A_l + A_{l+1} + A_{l+2} + … + A_r ≥ 0$으로 표현할 수 있습니다.
조건을 만족하는 $(l, r)$쌍의 개수를 구하기 위해서, prefix sum을 활용해봅시다. $A_l + A_{l+1} + A_{l+2} + … + A_r ≥ 0$은 $S_{l-1} ≤ S_r$과 같습니다. $S_{l-1} ≤ S_r$을 만족하는 $(l, r)$쌍의 개수를 세는 문제는 inversion counting이라는 이름으로 널리 알려져 있습니다.
prefix sum을 fenwick tree로 구현해주면서 parametric search를 해주면 $O(N log N log 10^9)$에 문제를 해결할 수 있습니다.
전체 코드
1 |
|