公式

E - Total Area of Bounding Boxes 解説 by admin


部分集合のサイズが \(2\) 以上という設定になっていますが、サイズが \(1\) 以下のときのバウンディングボックスの面積を \(0\) だと思うことにすると、全ての部分集合についての総和を求めても答えは変わりません。

各単位格子正方形について、バウンディングボックスに含まれる場合の数を計算し、その総和を求めれば良いです。

座標 \((X,Y)\) を左下、座標 \((X+1,Y+1)\) を右上とする正方形が \(S\) のバウンディングボックスに含まれるためには、以下の条件をすべて満たすことが必要十分条件です。

  • \(x\) 座標が \(X\) 以下である点が \(1\) つ以上 \(S\) に含まれる
  • \(x\) 座標が \(X+1\) 以上である点が \(1\) つ以上 \(S\) に含まれる
  • \(y\) 座標が \(Y\) 以下である点が \(1\) つ以上 \(S\) に含まれる
  • \(y\) 座標が \(Y+1\) 以上である点が \(1\) つ以上 \(S\) に含まれる

包除原理を用いると、以下の \(2\) 種類の値(とそれを回転させたもの)を計算できれば良いことになります。

  • (a) \(x\) 座標が \(X\) 以下の点のみからなる集合の個数
  • (b) \(x\) 座標が \(X\) 以下かつ \(y\) 座標が \(Y\) 以下の点のみからなる集合の個数

全ての単位格子正方形についての (a) の総和を求めることは簡単なので、(b) の総和を求める方法について考えます。

\(x\) 軸方向に平面走査を行うことを考えると、以下のようなクエリを高速に処理できるデータ構造を設計できれば良いです。

  • \(y\) 座標が \(Y\) である点を追加する
  • \(y\) 座標が \(Y\) 以下である点の個数を \(C_y\) としたときの \(\sum_{1 \le y \lt N} 2^{C_y}\) を求める

これは Lazy Segtree を用いるとクエリあたり \(O(\log N)\) で処理することが出来ます。

全体の計算量は \(O(N \log N)\) です。(コード

投稿日時:
最終更新: