kaage精進録

雑な解説とかライブラリとかおきもちの垂れ流しです。

競プロ典型 90 問 007 - CP Classes 解説

準備やりました.

問題リンク(Twitter/原案) 問題リンク(AtCoder/OJ)

QCFium 法が通ったので制約が上がりました.

解説

$A_i$ をソートして,$B_j$ の前後にある数との差の小さい方を取れば良いです. $B_j$ の $A$ の中での位置は,二分探索によって求められるので,全体の計算量は $O((N+M)\log N)$ になります.

サンプルコード

#include <iostream>
#include <algorithm>
constexpr int INF = 1000000000;
int N, Q, A[300010];
int main() {
    std::cin >> N;
    for (int i = 0; i < N; i++) std::cin >> A[i];
    std::sort(A, A + N);
    std::cin >> Q;
    for (int i = 0; i < Q; i++) {
        int B;
        std::cin >> B;
        int ans = INF;
        auto p = std::upper_bound(A, A + N, B);
        if (p != A + N) ans = std::min(ans, *p - B);
        if (p != A) ans = std::min(ans, B - *std::prev(p));
        std::cout << ans << std::endl;
    }
    return 0;
}