清华OJ范围查询

题目:

范围查询(Range)

Descriptioin
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.
Input
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].
Output
The number of points in S lying inside each of the m query intervals.
Example
Input
5 2
1 3 7 9 11
4 6
7 12
Output
0
3
Restrictions
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
描述
数轴上有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

我的代码:

#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;
template <class T>
//传入数组,待查找的值,和区间左右下标
int Binary_Search(T a[], const T&x, int len){
    int left = 0;
    int right = len;
    while(left < right){
        int mid = left + ((right - left)>>1);
        if(x < a[mid]){
            right = mid;
        }else{
            left = mid + 1;
        }
    }
    return --left;
}

template <class T>
void swap(T *a,int x, int y){
    T temp = a[x];
    a[x] = a[y];
    a[y] = temp;
}

template <class T>
int partition2(T *a, int left, int right){
    T key = a[left];
    int l =left + 1;
    int r = right;
    while(l <= r){
    //当内循环会影响外循环的循环变量时,在内循环的循环条件里一定要加上外循环的循环条件限制!!!
        while(l <= r && a[l] <= key){
            l++;
        }
        while(l <= r && a[r] > key){
            r--;
        }
        if(l<r)  //等于的时候交换是没有意义的,所以直接l<r即可
            swap(a,l,r);
    }
    swap(a,left,r);
    return r;
}

template <class T>
void quick_sort2(T *a, int left, int right){
    if(left < right){
        int q = partition2(a,left,right);
        quick_sort2(a,left,q-1);
        quick_sort2(a,q+1,right);
    }
}


struct P{
    int x;
    int y;
};
int main()
{
    int n,m;
    scanf("%d %d",&n,&m);
    int a[n];
    P p[m];
    for(int i=0; i<n; ++i){
        scanf("%d",&a[i]);
    }
    quick_sort2(a,0,n-1);
    for(int i=0; i<m; i++){
        scanf("%d %d",&p[i].x,&p[i].y);
        int l = Binary_Search(a,p[i].x-1,n);
        int r = Binary_Search(a,p[i].y,n);
        int ans = r - l;
        printf("%d\n",ans);
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章