ARC104

2完。ずっとCDEを考えていて、DEは面白そうに見えたけど結局解けなかった。Cは残り30分で、今までに考えていたアイデアの組み合わせで実は行けそうだと思って書いたが、WAが残った。

A - Plus Minus

典型だけど瞬殺はできない。最初に整数X,Yがあって、そこから計算したA,Bが与えられるので、つまり与えられる入力に対してA+BもA-Bも偶数になることが保証されている。

B - DNA Sequence

難しそうに見えるが、条件がどんなものかを考えると、要するにAとTおよびCとGが同じ個数ということだとわかる(同じ個数なら並べ替えて相補的にできるし、違う個数ならできない)。各文字について累積和を持てば区間にAが何個あるかとかがO(1)でわかる。よく見るとN<=5000なので全探索して解けた(難しそうな見た目から考察を経ると最初に見た制約を忘れがち)。計算量落とせそうだけど。

(追記)計算量落とせた。まずAとTはまとめていい。また、それによってA2個T2個とA3個T3個を同一視できる。ATとCGの2つの累積和をペアにして、sortかmapで同じものが何個あるか数える。同じもの同士が条件を満たす区間

C - Fair Elevator

2N個の〇を描いて、そこに0からN-1までの数を2個ずつ書き込む。離れた位置に同じ数があれば、その間にある数も同じ幅。左右どっちにも行けるか?幅がKのもののうち最も左にあるものを考えると、そこからは右に行くしかないし、間にある数も右に行くしかない。よって長さK*2の塊みたいなものが並んだものになる。端からDFSみたいにしていくのは計算量が全くわからない。たぶんダメそう。区間の個数はO(N^2)なので全部見ればよさそうにも思えるが、分割して可能ならよくても不可能な区間にしか分割できなくても全体ではできるってこともあるし。

かなり経って、その区間が可能なら全体が塊になっているか分割できるかのどちらかだと気づいた。全部の区間を小さいほうから見ていけば行けそうな気もする。残り時間もないので開き直って実装。ここで、同じ数が2個を超えて現れてはいけないことに注意する。3WA。しばらく見直して、そもそも「それぞれの階で乗り降りした人はただ 1 人」という条件を満たしていない自明なNoがあったことに気づき直して提出、1WA。時間もなく何も思いつかず終了。

見かけたツイートでA > Bの入力がある可能性を知って、直して提出したらACだった。そもそも、問題文に「A_i階で乗り、B_i階で降りました」とあるのに入力(これは矛盾している可能性がある)もA_iとB_iなのおかしくない?残り数分のとき、自分のソースだけでなくサンプルも見ればよかったね。さて、そもそも自分の解法はA_iとB_iを区別してなかった。通ったけど嘘ということだ。1 / -1 1で落ちる。

D - Multiset Mean

1以上N以下というxに対して非対称な制約があるのでできる気がしない(対称ならできるのかという話もある)。

E - Random LIS

これ面白そうだと思ってけっこう考えたんだけど、結果的にはかすりもしなかった。Nが小さいから、0 1 2 0 1みたいに(対応する整数列Xは例えば4 7 8 4 7)全列挙できるんじゃないかと思い、まあそもそもその列挙もわかってないんだけど、列挙できたとしてA_iがガタガタな可能性もあり、仕切りを入れて数える方法が使えない。