ARC147

4完。ARCは、長期的には実力が出るけど、まあその回の順位を競おうとするとクソゲー

A - Max Mod Min

ソートしてしまっていい。よく読むと、そのソートした列の左端と右端を使うとしてよい。シミュレーションが間に合うかを考えると、A_iとして選ばれたものが毎回半分以下になりそうだ(A_iがA_jの2倍以上ならA_j未満になって半分以下、そうでないならA_jの2倍未満のものからA_jが引かれるのでやはり半分以下)。操作を行うとA_iはA_j未満になるので末尾から先頭に持ってくればそのままソートされた状態が保たれる。dequeを使えばよい。

B - Swap to Sort

まず、奇数番目と偶数番目の2種類の世界に分かれていて、操作Bでは同じ世界の中同士しか入れ替えることができない。とりあえず、操作Bで好きなだけ揃えてその後転倒数のぶんだけ操作Aをするという方法を思いついたが、1234→3214→3241と逆に操作していくと反例が構成できてしまった(最初に3142と操作しては操作Aがたくさん必要になる)。転倒数について考え直すと、操作Bは操作Aを3回で実現できて転倒数は1か3変わる。

逆だ。そもそも操作Aの回数を最小にする問題なんだから、そこから考えるのは自然だろ。操作Bでは違う世界に行けないので、奇数の世界にいる偶数と偶数の世界にいる奇数が同数存在しその数だけ操作Aが必要になる。そしてそれは達成できる。なるほどねー。操作Bの回数が気になるが、1回の操作Aに対してN/2回以下の操作で隣接させることができ、操作Aの必要数はN/2以下なので、ここで4万。それぞれの世界のソートは、長さがN/2くらいなので、2回のソートでN*N/4回くらいでやはり4万。合計で10万よりは少ないのでOK。提出してWA。

正しそうな考察とコードをデバッグするのはつまらないね。これ競プロの構造的欠陥だよな。左から順に偶奇が合ってないのを見つけて、右に向かって相手を探してそこまで操作Bで持っていくという実装にしていたが、これだとスワップした結果その場所に偶奇が合わないものがまた存在している可能性がある。その場所をまた調べるように変更してAC。14分もかかってしまった。

C - Min Diff Sum

ある並べ方について、一人(同じ座標に他の人はいないとする)を微小に動かしたときのスコアの変化を考える。左右にいる人数が重要だ。左に5人右に1人の場合、左に動かすと動かした距離の4倍スコアが改善する。だが、区間なので扱いが難しい。

端から考えてみる。区間の右端が最小のものと区間の左端が最大のものを考えると、これはそれぞれ右端と左端を選ぶとしてよさそうだ。ただし、その2つの区間に共通部分があるとき(区間が1つしかないときを含む)は全部の人がその中の同じ座標を選べるので場合分けが必要。これを繰り返すことを考えると、もう解けていそうだ。最初はスコアを逐次計算していくことを考えていたが、座標が決まる(最後はこれまでに選んだ最大の右端(最小の左端でもよい(左右の人数が同じなので間ならどこでもいい))の座標に全員集める)のであとはABCのC問題みたいのを解くだけだ(これに10分かかるか3分で済むかはけっこうでかいよな)。座標が全部決まったらソートして左から自分より左の人たちとの距離の寄与を足していく。これには自分より左の人たちの座標の値の合計を持っておけばいい。

実装はけっこう大変で、priority_queueに区間の左端の位置と区間のインデックスを入れる。右も同様に。座標が決まったかのフラグも持ち、priority_queueのtopを見るときは既に決まってるやつを全部popしてから。あとはフラグを更新しながら座標を決めていく。B問題よりは時間がかからなかった。

(追記)いや言われてみれば2個ずつ座標を決めていくとき左右で完全に分かれてるからpriority_queueから既に決まってるやつが出てくるわけないんだ。そうなると左端と右端を別々にソートしてもよくなる。スコア計算も、決めた2個と内側のやつらとの寄与は2個の距離に内側の人数を掛ければいい。これに2個同士のも足す。短く書けるねー。

(追記)ABC267のBもそうだけど、短く書く方法が存在するからといって「この問題は実装が軽い」とはならない。

D - Sets Scores

縦N横Mの図を描く。一番上の行は2^M通り好きに決めることができる。そこからはM通りの選択が続くのでM^(N-1)通り。「素晴らしい集合の列」が何通りあるかがわかった。で、スコアだけど、積だし、独立な気がするので、個数の期待値(単にN/2)を掛けていく。サンプルが合った。そんなうまい話はないと思ったが、順位表を見るとペナ率が異常に低い。これは可能性があると思い提出するとAC。

BCでかなり苦戦したのに、わずか13分の未証明ACでなかったことに。

E - Examination

「不正」みたいな問題名にしたほうがいいだろと思ったけどEだからこれがいいのか。何かでソートして貪欲みたいな見た目だけど800点だからな。