Mitsubachiのメモ

組合せ論をしています

AGC032-E(Modulo Pairing) 解説

 

 

問題概要

2N個の整数(a_1,a_2,...,a_{2N})Mが与えられる。

2N個の整数をN個のペアにし、全てのペアに対しその総和をMで割ったときの余りの最大値を最小化したい。最小でいくつにできるか。

 

(a_1,a_2,...,a_{2N})a_1\leq a_2\leq...\leq a_{2N}となるようにソートしても当然答えは変わりません。以後は既にソートしてあるものとします。

ステップ1 最大値の最小化といえば

そう、二分探索ですね。答えをX以下にできるかという判定がO(N)でできるなら、この問題は二分探索でO(NlogM)で解くことができ、これは間に合いそうです。しかし、簡単にはいかなそうです。もし和をX以下にできるかという問題なら、ある数に対してその数との和がX以下にできる最大の数を取ればよいです。ただ、今回はMで割った余りをX以下にできるかという話ですので、合わせるべき数が一意に定まるとは限りません。初手の二分探索は難しそうです。

 

ステップ2 余りを取らないとする

ステップ1で「和をX以下にできるかという問題なら、ある数に対してその数との和がX以下にできる最大の数を取ればよい」と話しましたが、そもそもこの問題(N個のペアの総和の最大値を最小化したときの値)ならば、max(a_1+a_{2N},a_2+a_{2N-1},...,a_N+a_{N+1})が答えであるのは感覚的に分かるでしょう。下に証明を書きます。

N=2として、整数a_1,a_2,a_3,a_4があるとします(ソートしてあるものとします)。この時の答えはmax(a_1+a_4,a_2+a_3)であることを示します。a_1a_2,a_3a_4を対応させるとします。その場合の答えmax(a_1+a_2,a_3+a_4)は明らかにa_3+a_4ですが、これはa_1+a_4\leq a_3+a_4,a_2+a_3\leq a_3+a_4なのでこのペアは必ずしも最適ではありません。

次にa_1a_3,a_2a_4を対応させるとします。その場合の答えmax(a_1+a_3,a_2+a_4)は明らかにa_2+a_4ですが、これはa_1+a_4\leq a_2+a_4,a_2+a_3\leq a_2+a_4なのでこのペアも必ずしも最適ではありません。

よって、この問題は4個の整数がいかなる値でも答えはmax(a_1+a_4,a_2+a_3)です。これはN\geq3のときでも適当にペアを作った後、任意に2つのペアを選びこのように組み替えることで答えを最小化していくことができます。これを繰り返すと上の結論(max(a_1+a_{2N},a_2+a_{2N-1},...,a_N+a_{N+1})が答え)が示せます。

この構造を、余りを取る場合にも作れないだろうかと考えてみます。結論から言うと、ある2つのペアを選んだ時にそのペアが共にM未満もしくはM以上ならこれが使えます。

 

ステップ3 2種類ある場合

つまり選んだ2つのペアがM未満のペアとM以上のペア1つずつで構成されている場合です。選んだペア2つに含まれる4つの数を小さい順にa_1,a_2,a_3,a_4とします。

この時、ありえるのはa_1,a_3のペアがM未満かつa_2,a_4のペアがM以上のパターン(これをパターン1とします)、a_1,a_4のペアがM未満かつa_2,a_3のペアがM以上のパターン(これをパターン2とします)、a_2,a_3のペアがM未満かつa_1,a_4のペアがM以上のパターン(これをパターン3とします)、a_1,a_2のペアがM未満かつa_3,a_4のペアがM以上のパターン(これをパターン4とします)のいずれかです

パターン1の場合:

操作前の答えはa_1+a_3です。なぜならa_4<Mより、(a_2+a_4)%M<a_2\leq a_3<a_1+a_3が示せるからです。

しかし、これをパターン4の形にすると、各ペアのM未満もしくは以上という関係は変わらないので答えはa_1+a_2もしくは(a_3+a_4)%M<a_3となり、いずれにせよ操作前の答えより増えることはないのは明らかです。

パターン2、パターン3も同様に示すことができます。(証明は略)

よって、2つのペアがM未満のペアとM以上のペア1つずつで構成されている場合はパターン4のようにするのが最適です。

以上より、2つのペアを選んだ時に最適となる組み換えの方法が分かりました。これを繰り返すことによって、最適となるペアの組み方の1つに「そこより左は全てM未満のペア、右は全てM以上のペアとなる境界を1つ定め、左側右側のペアの組み方は端から順に取っていくことで構成することでできるもの」があることが分かります。

ステップ4 O(N^2)からO(NlogN)

境界の位置をひとつ固定した後は、境界の左側/右側でペアを作り、各ペアがM未満/以上であることを確かめた後、答えを求めればいいですが、計算量はO(N^2)で時間制限に間に合いません。

ここで、境界に関する以下の事実を踏まえます。

境界が左であるほど、境界の左側の各ペアはM未満になりやすくなる。

境界が左であるほど、境界の右側の各ペアはM以上になりにくくなる。

境界が左であるほど、全ペアの余りの最大値は小さくなる。

よって、境界の位置を二分探索し、条件を満たすような最も左の境界を求め、そのときの全ペアの余りの最大値を求めれば、答えが求まります。

この場合の計算量はO(NlogN)であり、間に合います。

 

 

感想

最大値の最小化というところから二分探索をしたい気持ちがありますが、まさかそれを使うのはあの場所か...というのが面白かったです。

O(N^2)にはすぐたどり着きましたが、それをO(NlogN)にするのは難しかったです。