AGC023

A - Zero-Sum Ranges

しゃくとり法と思わせて違うんだろ(負の数があるのでね)。これは、累積和が同じになるところ同士だ。その範囲の和が0になるから。ていうか少し前に同じことをしたような(yukicoderだった)。累積和はN+1個でいいよね。N=1なら累積和は2個で、その2個が同じなら、つまり元の1個の数が0ならその1個の和が0になる。累積和をソートして数えればいい。実装がちょっと面倒だけど、まあスピード重視でちゃっちゃと書いた。

B - Find Symmetries

見当もつかないので、まずは判定問題として考えてみる。逆に対称なやつから戻せる形の性質を調べるか?既に対称になってるやつを2*2に4つ並べて、そこから1か所切り出してみる。対称軸の隣の2個は同じ文字なので、そこでそこそこ強い必要条件がとれそう?で、切り出す範囲を1個ずつずらしていったときに、斜めに対称軸に沿って動かすと対称なままなことに気づいた。同値類でまとめられる。N通り調べればいいだけだ。300の3乗は通る(チキンなので少しだけ定数倍高速化した)。ところがサンプル1が通らない。ここで相当時間を使った。未だによくわかってないけど、対称軸と垂直に動かしてもダメなのだ。動かす幅が√2と1で違うからね。ナナメの列は、けっこうギッシリ入っている。

C - Painting Machines

(追記)解説読んできっちりコードを書くというのは実にしんどいなあ。コードはけっこうシンプルになるみたいなので頑張って解説を読んだ。「K-1個の隙間から」何個か選ぶという部分が頭おかしい。ただ、よく考えると、どこで重ねるか選ぶという話だ。しかしK回以下で塗る場合の数がわかればいいんだなあ。その線も選択肢にはあったが、ちょうどK回を求める以外に道はないという感覚だった。Combination周りのライブラリを改めて整備するいい機会になった。