@Metralix
2017-04-22T15:49:45.000000Z
字数 681
阅读 986
二分
题目大意
给出一个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;}
