そのうち誰かの役に立つ

もしくは誰の役にも立たない

競プロチャレンジ供養会場: AtCoder Beginner Contest 203 (Sponsored by Panasonic) D - Pond

コンテストでの時間切れや解けなかった過去問を振り返って供養していく

問題

Difficulty: 1622 (記事作成時点)

供養

解法

  • 問題をある $X$ が与えられたときに、すべての $K \times K$ 区間の中央値が $X$ 以上であるかを判定する問題にする
  • $S_{x, y}$ を $(1, 1)$ から $(x, y)$ の区間において $A_{i, j} \ge X$ である要素の個数とする
    • $S_{x, y}$ は以下の式で求められる \begin{align} S_{x, y} = \begin{cases} S_{x - 1, y} + S_{x, y - 1} - S_{x - 1, y - 1} + 1 & \mathrm{if}\; A_{i, j} \ge X \\ S_{x - 1, y} + S_{x, y - 1} - S_{x - 1, y - 1} & \mathrm{else} \end{cases} \end{align}
  • $(x, y)$ を右下に置く $K \times K$ 区間における $X$ 以上の要素数 $Q_{x, y}$ は $Q_{x, y} = S_{x, y} - S_{x - K, y} - S_{x, y - K} + S_{x - K, y - K}$
  • すべての $K \le x, y \le N$ について $Q_{x, y} \gt \lfloor \frac{K^{2}}{2} \rfloor$ ならば、すべての $K \times K$ 区間の中央値が $X$ 以上
  • 上記の判定問題 $F(X)$ を $X$ について二部探索し、$F(X)$ が真となる下限値が答え

実装

計算量は $O(N^{2}\mathrm{log}(\mathrm{max}(A_{i, j})))$

公式解説

躓いた点

  • どのように判定問題にするかが思いつかなかった