D - Impartial Gift Editorial by evima

別解

次のアルゴリズムで答えを計算できます。

  1. \(A\) を昇順にソートする。
  2. \(B_j\) について以下を行う。
    • 2-1. \(B_j + D\) 以下で最大の \(A_i\)二分探索で求める。(そのような要素が存在しないなら、手順 2-2 を飛ばす。)
    • 2-2. \(A_i \geq B_j - D\) なら、\(A_i + B_j\) を答えの候補とする。
  3. 答えの候補のうち最大のものを出力する。

この解法の時間計算量は \(O(N \log N + M \log N)\) です。\(B\) をソートする必要がないため、必ずしも公式解説の解法に劣らないことに注意してください。

実装例(Python)

import bisect
N, M, D = map(int, input().split())
A = sorted(map(int, input().split()))
B = map(int, input().split())
ans = -1
for b in B:
    i = bisect.bisect_right(A, b + D) - 1
    if i >= 0 and A[i] >= b - D:
        ans = max(ans, A[i] + b)
print(ans)

posted:
last update: