ブログ名

競技プログラミングやお歌のお話をする高菜です。

AGC 051 B - Bowling の解法

AGC 051 B - Bowling

editorial 解

(0, 1), (1, 0), (1, 1) に平行ないい感じのベクトル 3 本をとって10 倍格子を作ると a = b = c = 100, d = 1000 になります。

私の方針

書いてみて気づいたのですが、解説の方針のちょっと要領の悪いバージョンといったところですね。

着眼ポイント

  • a, b vs c, d を作れば、あとはこれを (1, 1) でずらして増殖すると良いです。(今考えると、これを 3 回やるのが editorial 解なのですね。)
  • 縦横には重なっていても、ずらせば斜め位置が全部違うようにできそうです。
  • 再帰的に構成できると嬉しいです。

再帰的構成

このような感じで、x 方向と y 方向交互に 2 冪だけずらしていくと、斜めにいは一切重ならず、縦横にはそこそこ(平方根くらい)重なっていることになります。

f:id:ngtkana:20201228114150j:plain

ずらします

このようにずらすと、c, d が影響を受けます。

f:id:ngtkana:20201228114145j:plain
斜めにずらすステップ

すると a, b, c, d の値はこのようになります。制約も OK です。

f:id:ngtkana:20201228114141j:plain
a, b, c, d の計算式

バーガーが斜めに重なっていないことの視覚化

f:id:ngtkana:20201228114137j:plain
線を引いた図

45 度ずらすと見やすいでしょうか。行列だと思うと、対角に 2 倍するのと反対角に 2 倍するのを交互にやります。

f:id:ngtkana:20201228114133j:plain
45 度回した図

感想

けっこううまくやったつもりだったのですが、考えてみると解説の方針の劣化版といった感じです。

いずれにしても、D 以外のところを重ねつつ D は重ねないように増殖していけばよいようですね。