描述
數軸上有n個點,對於任一閉區間 [a, b],試計算落在其內的點數。
輸入
第一行包括兩個整數:點的總數n,查詢的次數m。
第二行包含n個數,為各個點的坐標。
以下m行,各包含兩個整數:查詢區間的左、右邊界a和b。
輸出
對每次查詢,輸出落在閉區間[a, b]內點的個數。
樣例
見英文題面
限制
0 ≤ n, m ≤ 5×105
對於每次查詢的區間[a, b],都有a ≤ b
各點的坐標互異
各點的坐標、查詢區間的邊界a、b,均為不超過10^7的非負整數
時間:2 sec
內存:256 MB
題意:給一堆可能無序的點,查找落在【a,b】區間的點個數
思路:無序點使用快速排序改為有序序列,然后使用二分查找查找a,b的位置
注意(1)查找的是小於a的最大的位置,查找的是b的最大的位置,相減即可
(2)輸入輸出使用scanf,printf,否則會超時
代碼如下:

1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 int s[500005]; 5 int m,n; 6 7 //二分查找,返回不大於num的最后一個元素 8 int binSearch(int num,int lo,int hi){ 9 while(lo<hi){ 10 int mi=(lo+hi)/2; 11 if(num<s[mi]){ 12 hi=mi; 13 }else lo=mi+1; 14 } 15 return --lo; 16 } 17 int getpartition(int lo,int hi){ 18 int mi=s[lo]; 19 while(lo<hi){ 20 while(lo<hi&&mi<=s[hi])hi--; 21 s[lo]=s[hi]; 22 while(lo<hi&&s[lo]<=mi)lo++; 23 s[hi]=s[lo]; 24 } 25 s[lo]=mi; 26 return lo; 27 } 28 29 //快速排序 30 void quicksort(int lo,int hi){ 31 if(lo<hi){ 32 int mi=getpartition(lo,hi); 33 quicksort(lo,mi-1); 34 quicksort(mi+1,hi); 35 } 36 } 37 //注意輸入輸出太多,所以需要使用scanf,printf 加速輸入輸出 38 int main(){ 39 scanf("%d%d",&m,&n); 40 for(int i=0;i<m;i++){ 41 scanf("%d",&s[i]); 42 } 43 quicksort(0,m-1); 44 int a,b; 45 for(int i=0;i<n;i++){ 46 scanf("%d%d",&a,&b); 47 int resA=binSearch(a-1,0,m);//小於a的最后一個位置 48 int resB=binSearch(b,0,m);//b的最后位置 49 printf("%d \n",resB-resA); 50 } 51 return 0; 52 }