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 <iostream>
#include<bits/stdc++.h>
#define ll long long
#define INF 0x3f3f3f3f
const int N = 1e6 + 10;
using namespace std;
int dp[N];
int find_front(int n,int k) //找到查询值第一次出现的位置
{
int l=0;
int r=n-1;
int mid=0;
bool flag=0;
while(l<=r)
{
mid=(l+r)/2;
if(dp[mid]<k)
l=mid+1;
else
{
r=mid-1;
flag=1;
}
}
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=0;
while(l<=r)
{
mid=(l+r)/2;
if(dp[mid]>k)
r=mid-1;
else
{
l=mid+1;
flag=1;
}
}
if(flag)
return r;
else
return -1;
}
int main()
{
ios::sync_with_stdio(0);
int n,m;
while(cin>>n)
{
int i;
int k;
for(i=0; i<n; i++)
{
cin>>dp[i];
}
sort(dp,dp+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;
}