mooc 數據結構作業(一)范圍查詢(Range)


描述

數軸上有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 }
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM