ABC347

5完。Eが面白かった。

A - Divisible

当てはまるものをvectorに突っ込んでいく。これは、簡単だけど実装だけで1分行ってしまうやつ。

あ、出力の「昇順に出力せよ」を読んでなかった(問題文のところはちゃんと読んだ)。

B - Substring

愚直に全列挙してstd::setに突っ込む。

C - Ideal Holidays

Dは周期A+Bで割ったあまりに置き換えてsort, uniqueしておく。休日をどこで始めるか全探索する。Dの先頭かどうかで場合分けして、先頭でないときは末尾が次の週なのでA+Bを足す(ここがオーバーフローしないか不安だったのでllにした)。典型ではあるけどけっこう重く10分以上かかった。

D - Popcount and XOR

パッと見めちゃくちゃ簡単だが、ちゃんと考えていくとなかなか大変。popcountを考えると、popcount(C)がa+bより大きかったら作れない。あとは(XとYでビットを重ねる毎にpopcountが2減るので)偶奇が一致していればいいかなと思ったら、なんとCが2^60未満なのにXYも2^60未満で不自由だ。となると、XとYで両方立ってるビット位置の個数としてどんなものがありえるか全部知る必要がある。個数が最も多いのは簡単、最も少ないのは、Xは左からYは右から1を配置してmax(a + b - 60, 0)個。作れるpopcountの範囲がわかるので、その範囲かつa+bとpopcount(C)のが差が偶数なら作れる、そうでないなら作れない。重なる個数は、(a + b - popcount(C)) / 2。a,bからこれを予め引いておく(これに気づかず出力がおかしかった)。あとは、Cの下位から見てその01によって処理を分けて、0だったら重なる個数、1だったらaかbが残っているなら1にする。サンプルと一致しないので、popcount(X)とpopcount(Y)とX^Yを出力して入力と合っているか目視で確認する(バグを発見)。これで解けてるのが不思議な見た目だが、合ってるはずなので提出(軽くは確認した)。

E - Set Add Query

数列の要素を横に並べて、対応するインデックスがSに含まれるかで印を付けて、そういう図を描いて全然わからなかったけど、図を縦に伸ばすことで解けた。加算する値がSと関係なく毎回与えられるとして考えると見えやすい。Sから削除されるたびに、(オンオフで考えて)オンだった区間の和を足す(最後までSに残っていたものは別途処理)。加算する値の累積和と、いつ(何番目のクエリで)オンになったか(現在オフであれば-1)を持っておく。

なんか違和感のある設定だったけど、原案ではSのサイズではなくその逆数を足していたらしい。なるほどそれなら自然だ。でも小数ジャッジになるから変更されたと。

F - Non-overlapping Squares

とりあえず2次元累積和と、各マスを左上隅にした正方形の和を求める。2個でさえできない。解ける見た目をしていない。最後の10分は座ってるだけになった。フローとか思ったけどできるわけないし。1次元ならDPできる。1個を固定しても、順番に配置しても、2個でさえ難しく、3個なんて関係性が増えすぎてできるわけがない。

いやあ3つの長方形そういえば聞いた覚えはあるが、今回のようなギッチリ詰まってないやつでも当然そうなるのかいやあ。

G - Grid Coloring 2

順位表見て、あまり考えてない。AHCにありそうな設定。大体の答えは簡単に求まりそうだが、厳密にとなるとどういう話になるんだろうね。いやフローは全く考えなかった。どうやるのかわからんけど。