キーワード

数式処理,累積和,二分探索

解説

愚直に組 (i,j)(i,j) を全探索しようとすると,計算量は O(NM)O(NM) となり間に合いません。
考察をして計算量を改善する必要があります。

AA の要素の順番は答えに影響しないので,AA を昇順にソートして単調性を持たせます。
答えに BkB_k が寄与する部分は,i=1NAiBk\sum_{i=1}^{N}|A_i-B_k| です。
もし,Aj<BkAj+1A_j < B_k \leq A_{j+1} となる jj が存在するならば,
i=1NAiBk\sum_{i=1}^{N}|A_i-B_k|
=i=1j(BkAi)+i=j+1N(AiBk)=\sum_{i=1}^{j}(B_k-A_i)+\sum_{i=j+1}^{N}(A_i-B_k)
=jBki=1jAi+i=j+1NAi(Nj)Bk=jB_k-\sum_{i=1}^{j}A_i+\sum_{i=j+1}^{N}A_i-(N-j)B_k
=(2jN)Bki=1jAi+i=j+1NAi=(2j-N)B_k-\sum_{i=1}^{j}A_i+\sum_{i=j+1}^{N}A_i
と分解できます。
また,BkA1B_k \leq A_1 の場合は,i=1NAiBk=i=1NAiNBk\sum_{i=1}^{N}|A_i-B_k|=\sum_{i=1}^{N}A_i-NB_k であり,AN<BkA_N < B_k の場合は,i=1NAiBk=NBki=1NAi\sum_{i=1}^{N}|A_i-B_k|=NB_k-\sum_{i=1}^{N}A_i となります。
jBk,(Nj)BkjB_k, (N-j)B_kO(1)O(1) で求めることができ,i=1jAi,i=j+1NAi,i=1NAi\sum_{i=1}^{j}A_i, \sum_{i=j+1}^{N}A_i, \sum_{i=1}^{N}A_i は事前に O(N)O(N) で累積和を取っておけば O(1)O(1) で値を求めることができます。

AA の要素と BkB_k の大小関係がどの場合に該当するのかは二分探索によって O(logN)O(\log N) で調べられるので,結局,答えに BkB_k が寄与する部分は O(logN)O(\log N) で値を求めることができます。
これを 1kM1 \leq k \leq M を満たすすべての kk に対して求めた値の総和が答えになります。
計算量は O((N+M)logN)O((N+M)\log N) で,十分高速です。

なお,AA, BB のうち要素数が大きくない方をソートすることで,計算量は O((N+M)logmin(N,M))O((N+M)\log \min (N,M)) になります。

実装例(C++)