Official

D - Squares Editorial by tozangezan


各テストケースを定数時間で処理できればよさそうです。

以下、思考プロセスの例を順に書いていきます。

  • 答え \(ans\) が求めたい
  • \(ans\): 赤い正方形の内部と青い正方形の内部が重ならないように置く方法の数は複雑そうなので、全体から赤い正方形の内部と青い正方形の内部が重なるように置く方法 (\(X_1\) と呼ぶことにする) を引いて求めよう \(ans = (N-A+1)^2(N-B+1)^2 - X_1\)
  • \(X_1\): 「赤い正方形の内部と青い正方形の内部が重なる」には、「赤い正方形の \(x\) 座標の範囲と青い正方形の \(x\) 座標の範囲が重なる」「赤い正方形の \(y\) 座標の範囲と青い正方形の \(y\) 座標の範囲が重なる」が両方成り立っている必要がある。対称性からこれらはどちらも同じ値 (\(X_2\) と呼ぶことにする) で、 \(X_1 = X_2^2\)
  • \(X_2\): 長さ \(A\) の区間と長さ \(B\) の区間を長さ \(N\) の区間に詰めた時に重なる方法の数。区間の置き方の数から区間が重ならない置き方の総数 (\(X_3\) と呼ぶことにする) と引けば、 \(X_2 = (N-A+1)(N-B+1) - X_3\) と求められそう
  • \(X_3\): 対称性より赤が左にあるパターンと青が左にあるパターンに分けて良い。赤が左にあるパターンの総数を \(X_4\) とすると、\(X_3 = 2 X_4\)
  • \(X_4\): それぞれ (空白)(赤)(空白)(青)(空白) みたいなパターンになって空白のマスの総数は \(N-A-B\) だから \(N-A-B < 0\) なら \(X_4 = 0\) 通りだし、 \(N-A-B ≥ 0\) なら \(X_4 = (N-A-B+2)(N-A-B+1)/2\) 通りある
  • あとはこれを下から順にコードにすれば OK

posted:
last update: