【题目描述】
给出n个数,
m次询问。
每次询问数字x在n个数中出现的次数。
【输入格式】
第一行输入两个整数n和m。
第二行输入n个整数。
第三行输入m个整数,每个整数表示一次询问。
【输出格式】
输出一行m个数,表示每次询问的答案。答案之间用空格隔开。
【输入样例】
5 3
6 15 15 23 50
6 15 20
【输出样例】
1 2 0
【数据范围】
30%的数据,1≤n,m≤1000,1≤ai≤1000;
50%的数据,1≤n,m≤1000,−1000≤ai≤1000;
100%的数据,
1≤n,m≤100000,
−1000000000≤ai≤1000000000;
我的思路:先排序,二分一个数最先和最后出现的位置,最后减一减。
代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int f1(int d[],int l,int r,int k){
while(l<r){
int mid=(l+r)/2;
if(d[mid]>=k)
r=mid;
else
l=mid+1;
}
return l;
}
int f2(int d[],int l,int r,int k){
while(l<r){
int mid=(l+r+1)/2;
if(d[mid]<=k)
l=mid;
else
r=mid-1;
}
return l;
}
signed main(){
int n,m,a[123456];
cin>>n>>m;
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=0;i<m;i++){
int k;
cin>>k;
cout<<f2(a,0,n-1,k)-f1(a,0,n-1,k)+1<<" ";
}
}