@Metralix
2017-04-22T23:49:45.000000Z
字数 681
阅读 811
二分
题目大意
给出一个n位数升序排列的数列,然后q个查询,每个查询问指定的区间覆盖了数列中几个数?
解题思路
二分枚举区间的起始点和终点在数列中的位置。
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <math.h>
using namespace std;
const int MAXN=100005;
int a[MAXN];
int turn=1;
int n,q,x,y;
int binary_s_low(int x){
int l=0,r=n-1,mid=0;
while(l<=r)
{
mid=(l+r)>>1;
if(a[mid]<x) l=mid+1;
else r=mid-1;
}
return l;
}
int binary_s_up(int x){
int l=0,r=n-1,mid=0;
while(l<=r)
{
mid=(l+r)>>1;
if(a[mid]<=x) l=mid+1;
else r=mid-1;
}
return l;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&n,&q);
printf("Case %d:\n",turn++);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int j=0;j<q;j++)
{
scanf("%d %d",&x,&y);
int l=binary_s_low(x);
int r=binary_s_up(y);
printf("%d\n",r-l);
}
}
return 0;
}