题意:有p个点,q条线段(x,y),求每条线段上各有多少个点。输入的点按照升序输入且不重复。
分析:裸的二分查找。对于每条线段找到>=x的最小值的位置和<=y的最大值的位置然后相减就行了。
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int t,p,q;
int a[100005];
int f(int x,int y)
{
int l=0;
int r=p-1;
int ret1=-1;
while(l<=r){
int mid=(l+r)>>1;
if(a[mid]>=x){
ret1=mid;
r=mid-1;
}
else l=mid+1;
}
l=0,r=p-1;
int ret2=-1;
while(l<=r){
int mid=(l+r)>>1;
if(a[mid]<=y){
ret2=mid;
l=mid+1;
}
else r=mid-1;
}
if(ret1==-1||ret2==-1) return 0;
return ret2-ret1+1;
}
int main()
{
scanf("%d",&t);
for(int cas=1;cas<=t;cas++){
printf("Case %d:\n",cas);
scanf("%d%d",&p,&q);
for(int i=0;i<p;i++) scanf("%d",&a[i]);
while(q--){
int x,y;
scanf("%d%d",&x,&y);
printf("%d\n",f(x,y));
}
}
}