Description
给你一个序列,有N个整数(int以内),判断一个数在这个序列中出现几次。
Input
多组输入,输入到文件结尾
首先输入一个n,然后输入n个整数。
在输入一个m,代表查询的个数 ,然后输入m个数(int以内)。
n,m <= 100000;
Output
对应每一次查询,输出这个数在序列中出现几次。
Sample
Input
5
1 2 2 3 5
3
2 4 5
Output
2
0
1
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int a[N];
int find_front(int n, int k)//找到查询值第一次出现的位置
{
int l = 0;
int r = n - 1;
int mid = 0;
bool flag = false;
while(l <= r)
{
mid = (l + r) / 2;
if(a[mid] < k)
l = mid +1;
else
{
r = mid - 1;
flag = true;
}
}
if(flag)
return l;
else
return -1;
}
int find_last(int n, int k)//找到查询值最后一次出现的位置
{
int l = 0;
int r = n - 1;
int mid = 0;
bool flag = false;
while(l <= r)
{
mid = (l + r) / 2;
if(a[mid] > k)
r = mid - 1;
else
{
l = mid + 1;
flag = true;
}
}
if(flag)
return r;
else
return -1;
}
int main()
{
ios::sync_with_stdio(0);
int n, m;
while(cin >> n)
{
int k;
for(int i = 0; i < n; i++)
cin >> a[i];
sort(a, a + n); //排序后进行位置查询
cin >> m;
while(m--)
{
cin >> k;
int l = find_front(n, k);
if(l == -1)
cout << 0 << endl;
else
{
int r = find_last(n, k);
cout << r - l + 1 << endl;
}
}
}
return 0;
}