D. K-th Nearest
将问题:找到和第 k 远的距离,转化成,二分一个距离(半径),以 bi 为圆心,有多少 a 点在圆内,如果大于等于 k 个就成立(可能会存在并列,也就是 k 和 k + 1 的距离相等)
看 [ b - mid,b + mid ] 中有多少个 a 点,只需要在 a 中 lower 左端点,upper 右端点。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 5, INF = 1e18;
int T, n, q, cnt, ans, a[N];
string s;
bool check(int x, int k, int R)
{
int l = lower_bound(a + 1, a + n + 1, x - R) - a;
int r = upper_bound(a + 1, a + n + 1, x + R) - a;
return r - l >= k;
}
signed main()
{
cin >> n >> q;
for (int i = 1; i <= n; i ++)
cin >> a[i];
sort(a + 1, a + n + 1);
while (q --)
{
int b, k;
cin >> b >> k;
int l = 0, r = 1e9, mid;
while (l <= r)
{
mid = l + (r - l) / 2;
if (check(b, k, mid))
r = mid - 1, ans = mid;
else
l = mid + 1;
}
cout << ans << '\n';
}
return 0;
}