そのうち誰かの役に立つ

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

競プロチャレンジ供養会場: AtCoder Beginner Contest 211 F - Rectilinear Polygons

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

問題

Difficulty: 2350 (記事作成時点)

供養

解法

  • 簡単のため多角形がすべて長方形の場合を考えると、長方形が $(x_{i, 1}, y_{i, 1}), (x_{i, 1}, y_{i, 2}), (x_{i, 2}, y_{i, 1}), (x_{i, 2}, y_{i, 2})$ の4点からなるとき、$(x_{j}, y_{j})$ がいくつの長方形に含まれるかという問題になる
    • $x_{i, 1} \lt x_{i, 2}, y_{i, 1} \lt y_{i, 2}$ とする
  • 2次元区間和を使って $x = 0, 1, \dots$ のときに $y = 0, 1, \dots$ にいくつの長方形が重なっているかを区間和を更新しながら求める
    • $x = x_{i, 1}$ のときに $y = y_{i, 1}$ で $+1$、$y = y_{i, 2}$ で $-1$
    • $x = x_{i, 2}$ のときに $y = y_{i, 1}$ で $-1$、$y = y_{i, 2}$ で $+1$
    • $x = x_{j}$ のときに、その時点まで操作をした後の $\lbrack 0, y_{j} \rbrack$ の区間和がクエリの答えとなる
    • 区間和はBITで持っておくと任意の $y$ についての計算ができる
  • 多角形が長方形でない場合の処理を考える
    • 多角形を $x$ 軸に平行にスライスすると長方形の集合となる
    • このとき、各長方形の操作を合算すると元の多角形で頂点ではない部分の操作は打ち消しあう
      • $(x, y)$ が左下(右下)の場合の操作と左上(右上)の場合の操作が打ち消しあう関係にある
    • 残った操作は長方形の左下もしくは右上に相当する操作と左上もしくは右下に相当する操作が元の多角形の頂点順に交互に現れる
    • $x$ について最小な頂点集合の中で $y$ について最小な頂点 $(x_{i, j}, y_{i, j})$ は必ず長方形の左下に相当する
    • $(x_{i, j}, y_{i, j})$ から順にどちらの操作かを決めていき、対応する位置での操作となるよう操作列に組み込んでいけばよい

実装

計算量は $y$ 軸方向の最大値を $U$ として $O((\sum M+Q)\log U)$

公式解説

躓いた点

  • 多角形の場合の処理が時間内に思いつかなかった