计算一组差大数组中某个元素的个数

问题遇到的现象和发生背景

蒜头君手上有个长度为 nn 的数组 AA。由于数组实在太大了,所以蒜头君也不知道数组里面有什么数字,所以蒜头君会经常询问在数组 AA 中,等于 xx 的数字有多少个?

输入格式
第一行输入两个整数 nn 和 mm,分别表示数组的长度和查询的次数。

接下来一行有 nn 个整数 a_ia
i

接下来 mm 行,每行有 11 个整数 xx,表示蒜头君询问的整数。

输出格式
对于每次查询,输出一个整数,表示数组 AA 中有多少个 xx。

数据范围
1 \le n, m \le 10^5, 0 \le x \le 10^61≤n,m≤10
5
,0≤x≤10
6

问题相关代码,请勿粘贴截图

######报错
Time Limit Exceeded

#######


include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF){
        int m;cin>>m;
    int* a=(int *)malloc(1000000*sizeof(int));
    int* aim=(int *)malloc(1000000*sizeof(int));
    int* ans=(int *)malloc(1000000*sizeof(int));
    for(int i=0;i<n;i++)
    cin>>a[i];
    for(int i=0;i<m;i++)
    {
        cin>>aim[i];
        getchar(); 
    }
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<n;j++)
        { 
            if(aim[i]==a[j])
            ans[i]++;
        }
    }
    for(int i=0;i<m;i++)
    cout<<ans[i]<<endl;
    }
    
    return 0;
 } 

输入
10 5
1 1 1 2 3 5 5 7 8 9
0
1
4
9
10

结果
0
3
0
1
0

主要是 ans数组你没有初始化为0

    int* ans=(int *)malloc(1000000*sizeof(int));
    memset(ans,0,1000000*sizeof(int));


#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 1e5+4;
int nums[MAXN];
 
int main() {
    int n,m;
    scanf("%d%d", &n, &m);
    for (int i=0; i<n; i++) {
        scanf("%d", &nums[i]);
    }
 
    //排序
    sort(nums, nums+n);
 
    for (int i=0; i<m; i++) {
        int x;
        scanf("%d", &x);
 
        int lower = lower_bound(nums, nums+n, x)-nums;// 函数用于在指定区域内查找不小于目标值的第一个元素
        int upper = upper_bound(nums, nums+n, x)-nums;//用于在指定范围内查找大于目标值的第一个元素
        printf("%d\n",upper-lower);
    }
 
    return 0;
}

用二分查找可以有效解决
lower_bound(int* ,int* +i, int);