第三届沈阳航空航天大学校赛(大连海事大学赛)---C: Greater or Lesser (sort)

来源:互联网 发布:压力传感单片机 编辑:程序博客网 时间:2024/06/10 01:21

Greater or Lesser

Time Limit: 2 Sec  Memory Limit: 128 MB

Description

Baby A has given you N positive integers, then, he will ask M times. Each query is positive integer x. For each query, please tell Baby A how many positive integers there are lesser than x or greater than x.

Input

Input contains several test cases ending by the end of file. The first line of each test case is two positive integers N and M (1 <= N <= 2 * 10^6, 1 <= M <= 5000). The second line has N positive integers standing for the numbers that baby A has given you. Then M lines follow. Each line has a positive integer standing for a query. Each number will be lesser than 10^8.

Output

For each query, output one line contains two numbers, standing for the number in Baby A's set that is lesser and greater than x.

Sample Input

9 41 1 2 5 3 3 7 10 2345453 22 3 6110

Sample Output

4 36 36 29 00 33 0




题意:给n个数,有m次询问,每次询问都有一个x,输出在这个序列中,有多少个数比x小,有多少比x大。


分析:先把数组从小到大排个序,然后用lower_bound(a, a+n, key)和upper_bound(a, a+n, key)进行处理,其中lower_bound(a, a+n, key)返回的a数组中第一个比key小的元素的地址,所以我们用lower_bound(a, a+n, key) - a 就得到了比key小的元素个数,同理,upper_bound(a, a+n, key)返回的是a中第一个比key大的元素位置,则(a + n) - upper_bound(a, a+n, key)就得到了a中比key大的元素个数。而且这个速度还是很可观的。




AC代码:

#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>using namespace std;int a[2000005];int main(){//freopen("in.txt", "r", stdin);int n, m, p;while(scanf("%d%d", &n, &m)!=EOF){memset(a, 0, sizeof(a));int fo = 0;for(int i=0; i<n; i++){scanf("%d", &a[i]);}sort(a, a+n);            //从小到大排序for(int i=0; i<m; i++){scanf("%d", &p);printf("%d%d\n", lower_bound(a, a+n, p) - a, (a + n) - upper_bound(a, a+n, p));   //求值}}return 0;}


lower_bound(a, a+n, key)和upper_bound(a, a+n, key)对于我这种比较懒的人,还是很好用的^_^



0 0
原创粉丝点击