Let S be a set of n integral points on the x-axis. For each given interval [a, b], you are asked to count the points lying inside.
The first line contains two integers: n (size of S) and m (the number of queries).
The second line enumerates all the n points in S.
Each of the following m lines consists of two integers a and b and defines an query interval [a, b].
The number of points in S lying inside each of the m query intervals.
Input
5 2
1 3 7 9 11
4 6
7 12
Output
0
3
0 <= n, m <= 5 * 10^5
For each query interval [a, b], it is guaranteed that a <= b.
Points in S are distinct from each other.
Coordinates of each point as well as the query interval boundaries a and b are non-negative integers not greater than 10^7.
Time: 2 sec
Memory: 256 MB
这道题目,好早以前就接触过,那时候数据结构刚学,什么也不懂,今年又来刷这套题了,感觉还好
题目求 [a, b] 内所有的元素个数,二分搜索,求下界,对a求它严格的下界, 对b求它不严格的下界,搞定。
这道题目不用二分,只能拿一部分分数。
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 using namespace std; 5 const int MAX_SIZE = 5E5 + 10; 6 int num[MAX_SIZE]; 7 int a[MAX_SIZE]; 8 9 void quick_sort(int s[], int l, int r) 10 { 11 if(l < r) 12 { 13 int i = l, j = r, x = s[l]; 14 while(i < j) 15 { 16 while(i < j && s[j] >= x) 17 j--; 18 if(i < j) 19 s[i++] = s[j]; 20 21 while(i < j && s[i] < x) 22 i++; 23 if(i < j) 24 s[j--] = s[i]; 25 } 26 s[i] = x; 27 quick_sort(s, l, i-1); 28 quick_sort(s, i+1, r); 29 } 30 } 31 32 ///二分查下届 33 int BSearchLowerBound(int arry[], int low, int high, int target) 34 { 35 if(high < low || target <= arry[low]) 36 return -1; 37 int mid = (low + high + 1) / 2; 38 while(low < high) 39 { 40 if(arry[mid] < target) 41 low = mid; 42 else 43 high = mid - 1; 44 mid = (low + high + 1)/2; 45 } 46 return mid; 47 } 48 49 int BSearchLowerBound_1(int arry[], int low, int high, int target) 50 { 51 if(high < low || target < arry[low]) 52 return -1; 53 int mid = (low + high + 1) / 2; 54 while(low < high) 55 { 56 if(arry[mid] <= target) 57 low = mid; 58 else 59 high = mid - 1; 60 mid = (low + high + 1)/2; 61 } 62 return mid; 63 } 64 65 int main() 66 { 67 int n, m; 68 int x, y, ans; 69 while(~scanf("%d %d", &n, &m)) 70 { 71 for(int i = 0; i < n; i++) 72 { 73 scanf("%d", num+i); 74 } 75 //quick_sort 下标从 0 开始 76 quick_sort(num, 0, n-1); 77 78 for(int i = 0; i < m; i ++) 79 { 80 scanf("%d %d", &x, &y); 81 82 ans = BSearchLowerBound_1(num, 0, n-1, y) - BSearchLowerBound(num, 0, n-1, x); 83 84 printf("%d\n", ans); 85 } 86 } 87 return 0; 88 }