geam1113’s diary

主にAtcoderのコンテストの備忘録を書きます。AtCoder緑と水色を行ったり来たりしています。

ARC138 参加記録

コンテスト中AC:A

A - Larger Score

一応、考察した内容ですが、あまり自信はないです。

K番目までのAから順番を保ったまま抜き出した部分列をx=\{x_1,\cdots , x_m\}、同様にK+1番目以降の要素から得られる部分列をy=\{y_1,\cdots , y_m\}とします。

また、任意のx_iK+1番目以降に移動させ、任意のy_jK番目以内に移動させる操作を入れ替えと呼ぶことにします。

入れ替えに必要な操作回数

x_iy_jの入れ替えに必要な最小の操作回数は、x_iK番目に移動させた後、y_jK番目に移動させればよいので、x_iA_sy_jA_tとすると、K-s+t-K=t-s回となります。

複数個入れ替える場合に必要な操作回数

例えば、i'\lt iであるx_{i'},x_iと、j\lt j'であるy_j , y_{j'}を入れ替える場合を考えます。
この時、x_iy_jを入れ替えてから、x_{i'}y_{j'}を入れ替える必要があります。つまり、K番目に近いもの同士から順に入れ替えます。

そうでない場合、操作回数はこれより増えます。
なぜなら、例えば、x_{i'}を先にK番目に移動させると、x_iは1つ前に出るため、必要な操作回数が1回増えます。

問題の条件を満たすのに必要な操作回数

まず、明らかにx_i \lt y_jを満たすもの1組を入れ替えると達成可能です。

では、複数個入れ替えて最適になる場合があるか考えます。
今、K以下とK+1以上からm個選び、それらが、以下の条件を満たすとします。

x_1+\cdots +x_m \lt y_1+\cdots +y_m

ここで、x_i \geq y_jとなる組を取り除いても、条件は満たされます。

取り除けるだけ取り除くと、結局、任意のx_iy_jについてx_i \lt y_jが成立します。

取り除いた後の個数をm'すると、前述したとおり、x_{m'},x_{m'-1},\cdots , 1y_1,y_2,\cdots ,y_{m'}を順に入れ替えしていくのが最適です。
ここで、x_{m'}y_1を交換した時点で問題文の条件を満たすので、結局1個だけの交換を考慮するだけでよくなります。

また、x_{m'} = A_s,\ y_1 = A_tであったとします。この時、t'\lt tかつA_s \gt A_{t'}を満たすようなA_{t'}A_tの代わりにすると操作回数がより少なくなります。

結局、必要な最小回数の求め方は、i=1,2,\cdots  ,Kについて、A_iA_jを入れ替える際に必要な交換回数を求め、その中の最小が答えとなります。但し、jj\geq K+1かつA_j \gt A_iを満たす中で最小のものです。

jは、座標圧縮して、Segment Treeで計算しました。
提出コード