[关闭]
@Metralix 2017-04-22T23:49:45.000000Z 字数 681 阅读 811

B - Points in Segments

二分


题目大意

给出一个n位数升序排列的数列,然后q个查询,每个查询问指定的区间覆盖了数列中几个数?

解题思路
二分枚举区间的起始点和终点在数列中的位置。

  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cstring>
  4. #include <math.h>
  5. using namespace std;
  6. const int MAXN=100005;
  7. int a[MAXN];
  8. int turn=1;
  9. int n,q,x,y;
  10. int binary_s_low(int x){
  11. int l=0,r=n-1,mid=0;
  12. while(l<=r)
  13. {
  14. mid=(l+r)>>1;
  15. if(a[mid]<x) l=mid+1;
  16. else r=mid-1;
  17. }
  18. return l;
  19. }
  20. int binary_s_up(int x){
  21. int l=0,r=n-1,mid=0;
  22. while(l<=r)
  23. {
  24. mid=(l+r)>>1;
  25. if(a[mid]<=x) l=mid+1;
  26. else r=mid-1;
  27. }
  28. return l;
  29. }
  30. int main()
  31. {
  32. int t;
  33. scanf("%d",&t);
  34. while(t--)
  35. {
  36. scanf("%d %d",&n,&q);
  37. printf("Case %d:\n",turn++);
  38. for(int i=0;i<n;i++)
  39. scanf("%d",&a[i]);
  40. for(int j=0;j<q;j++)
  41. {
  42. scanf("%d %d",&x,&y);
  43. int l=binary_s_low(x);
  44. int r=binary_s_up(y);
  45. printf("%d\n",r-l);
  46. }
  47. }
  48. return 0;
  49. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注