AT_abc364_d 题解
题目传送门
思路
这道题用二分答案。题目中的
设每一次二分的点为
注意事项
- 二分的右边界要开大,建议
2\times10^8 。
AC CODE
#include<bits/stdc++.h>
using namespace std;
int read(){int x=0;char f=1,ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();return x*f;}
const int N=1e5+10,R=2e8;
int n,q,a[N];
int check(int x,int b,int k){
int l=lower_bound(a+1,a+n+1,b-x)-a;
int r=upper_bound(a+1,a+n+1,b+x)-a;
return r-l>=k;
}
int main(){
n=read(),q=read();
for(int i=1;i<=n;++i)
a[i]=read();
sort(a+1,a+n+1);
while(q--){
int b=read(),k=read(),l=0,r=R;
while(l<=r){
int mid=(l+r)>>1;
if(!check(mid,b,k))
l=mid+1;
else r=mid-1;
}
printf("%d\n",l);
}
return 0;
}