F - Walnuts in Xmas Lease

2 secs 1024 MB
matcharate12's icon matcharate12

この問題はシミュレーションによる考察を問います。

O(WlogW)O(W\log_{}W) 解法 (TLE)

それぞれの要素に操作を行った後、MmM-m を最小化させる問題は、「要素を小さい順に操作をしていく」ことが典型です。
この問題の場合、一番大きい要素は変更することは最適ではありません。なぜかというと、MmM-m の式から明らかに増加していってしまうためです。

なので MM は与えられた際の数列の中で一番大きい要素、すなわち M=max(Ai)M=\max(A_i) とします。
そして MM を基準に m=min(Ai)m=\min(A_i) を増加させていきます(すなわちできるだけ MM を除くすべての要素に対して MM に近づけたい)。

AA に直接操作を施すので AA は操作の順番に応じて変化します。しかしなるべく小さい要素から更新していきたいです。
これを実現させるためには、優先度付きキューを用いて実装することが適切です。

このキュー( QQ とします)を用いることで、より MM に近づけることができます。
具体的には QQ から 22 番目に大きい※要素 b2b_2 を取り出し、Mb2M\ne b_2 ならば b2b_211 ずつ増加させます。
逆に M=b2M=b_2 ならば Mm=Mb2=Mmin(Qi)=0M-m=M-b_2=M-\min(Q_i)=0 を満たしていることが分かるので操作を終えます。

ただし MM は操作させないようにするため、QQ から M=max(Ai)M=\max(A_i) は除外して考えることに注意する必要があります。
以上からこの方針で実装すると O(WlogW)O(W\log_{}W) となります。

...しかし制約上 W109W\le 10^9 であるため、時間制限には間に合いません。では、どうしたらよいでしょうか?

M=max(Ai)M=\max(A_i) を除外しているので、これは単に QQ から一番小さい要素を取り出すことと同値です。

O(NlogN+max(Ai))O(N\log_{}N+\max(A_i)) 解法

上で書いた O(WlogW)O(W\log_{}W) 解法を用いて、実際に要素を更新する手続きを書き表してみます。例えば A=(3,4,1,3,2),W=6A=(3,4,1,3,2),W=6 としてみます。
QQAA を昇順に並び替えるため、最初 Q=(1,2,3,3)Q=(1,2,3,3) となります(QQ から M=max(Ai)=A2=4M=\max(A_i)=A_2=4 は除外することに注意してください)。
また常時 QQ は昇順に並べ替えられることに注意してください。

  • b2=Q1=1b_2=Q_1=1 である。414\ne 1 であるから、b2b_211 増やして並び替えると Q=(2,2,3,3)Q=(2,2,3,3) となる。(W=5W=5)
  • b2=Q2=2b_2=Q_2=2 である。424\ne 2 であるから、b2b_211 増やして並び替えると Q=(2,3,3,3)Q=(2,3,3,3) となる。(W=4W=4)
  • b2=Q1=2b_2=Q_1=2 である。424\ne 2 であるから、b2b_211 増やして並び替えると Q=(3,3,3,3)Q=(3,3,3,3) となる。(W=3W=3)
  • b2=Q1=3b_2=Q_1=3 である。434\ne 3 であるから、b2b_211 増やして並び替えると Q=(3,3,3,4)Q=(3,3,3,4) となる。(W=2W=2)
  • b2=Q1=3b_2=Q_1=3 である。434\ne 3 であるから、b2b_211 増やして並び替えると Q=(3,3,4,4)Q=(3,3,4,4) となる。(W=1W=1)
  • b2=Q1=3b_2=Q_1=3 である。434\ne 3 であるから、b2b_211 増やして並び替えると Q=(3,4,4,4)Q=(3,4,4,4) となる。(W=0W=0)

こうして QQ の変化をよく見てみると、次のことが分かります。

  • AA を昇順に並べ替えた数列 A=(A1,A2,,AN)A'=(A_1',A_2',\dots ,A_N') とします。また連続する整数の集合を SS として A=(S1,S2,,Sn)A'=(S_1,S_2,\dots ,S_n) と表すことにする。
    ここで nnAA に含まれる整数の個数と一致する。
    このとき k=1,2,,N1k=1,2,\dots ,N-1 に対して SkSk+1S_k\ne S_{k+1} である限り SkS_k に含まれる一番小さい要素を 11 ずつ足していくことが最適である

ここで集合 X,YX,YX=YX=Y を満たすとは、XXYY いずれも集合の要素数を問わず、要素がすべて同じであることと定義します。
反対に XYX\ne Y を満たすとは、 少なくとも一方が X,YX,Y で異なる要素を含むことと定義します。

例えば X=(2,2,2),Y=(2,2)X=(2,2,2),Y=(2,2)X=(1),Y=(1,1)X=(1),Y=(1,1) などは X=YX=Y であり、X=(2,2,3),Y=(2,2)X=(2,2,3),Y=(2,2)X=(2,2,2),Y=(2,1)X=(2,2,2),Y=(2,1) などは XYX\ne Y です。

したがって本問題は最初に与えられる数列 AA に含まれる整数に依存する問題に帰着することができました。
具体的には、次のような手続きを行えばよいです。ここで便宜上、現時点 QQ に含まれる任意の整数 kk の個数を cnt(k)\text{cnt}(k) と表します。

  • TLEになる上に書いた解法と同じ通り、MM を除外して考えるので i=2,3,,Ni=2,3,\dots ,N に対して cnt(Ai)\text{cnt}(A_i') を数える
  • その後 x=1,2,,max(Ai)(=AN)x=1,2,\dots ,\max(A_i)(=A_N') に対して以下を WW00 以下になるまで繰り返す
    • cnt(x)=0\text{cnt}(x)=0 なら考えないので、xxx+1x+1 に更新してからそのあとの処理を飛ばす
    • cnt(x+1)\text{cnt}(x+1)min(W,cnt(x))\min(W,\text{cnt}(x)) だけ加算し、それぞれ W,cnt(x)W,\text{cnt}(x) から min(W,cnt(x))\min(W,\text{cnt}(x)) だけ減少させる
    • xxx+1x+1 に更新して、上の操作を繰り返す

この計算を終えた後、v=1,2,,max(Ai)=ANv=1,2,\dots ,\max(A_i)=A_N' の順で、初めて cnt(v)>0\text{cnt}(v)\gt 0 を満たす vv が、最終的に求める mm になります。
よってこの解法で求める答えは Mm=ANvM-m=A_N'-v となります。

AA をソートするのに O(NlogN)O(N\log_{}N) を要することに注意して、以上からこの解法では計算量が O(NlogN+max(Ai))O(N\log_{}N+\max(A_i)) となります。Ai105A_i\le 10^5 という制約から、この問題を解くことができました。