Time Limit: 2 Sec Memory Limit: 128 Mb
Description
给出一个由n个整数组成的数列 a1, a2, a3, ..., an
之后给出m个整数k。 问:对于每一个k,数列中有多少个数比k大?
Input
输入共包括三行
第一行是两个由空格隔开的正整数n和m
第二行是由n个整数组成的数列 a1, a2, a3, ..., an ,数与数之间由空格隔开。
第三行有m个整数k,数与数之间由空格隔开。
保证 0 < n ≤ 1 × 103; 0 < m ≤ 1 × 103; − 1 × 103 ≤ a1, a2, a3, ..., an ≤ 1 × 103; − 1 × 106 ≤ k ≤ 1 × 106;
Output
输出共包括m行,每行一个整数,表示数列中有多少个数比k大
Sample Input
5 5 1 2 3 4 5 3 5 4 6 -1
Sample Output
2 0 1 0 5
Hint
题目给的数据范围很小(-1000~1000),可以先统一映射到 0~2000,统计总数与前缀和
对于每个 k,超出范围可直接得结果,范围内就用总数减去前缀和。
代码实现
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <math.h>
#define ll long long
/*
题目给出的范围为-1000到1000,可将其映射到0到2000
1.当k+1000<0,说明所有数都比k大
2.当k+1000>2000,说明所有数都比k小
3.当0<=k+1000 && k+1000<=2000,sum-cnt[k]
sum: 存所有数总和n
cnt[k]: 存所有比k小的数
*/
const int Maxn = 2e3 + 10;
int a[Maxn], cnt[Maxn];
int sum, ans;
int main()
{
int n, m;
while (scanf("%d%d", &n, &m) != EOF)
{
memset(cnt, 0, sizeof(cnt));
for (int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
cnt[a[i] + 1000]++;
}
sum = n;
for (int i = 1; i <= 2000; i++)
{
cnt[i] += cnt[i - 1];
}
for (int i = 0; i < m; i++)
{
int k;
scanf("%d", &k);
k += 1000;
if (k < 0)ans = sum;
else if (k > 2000)ans = 0;
else ans = sum - cnt[k];
printf("%d\n", ans);
}
}
}