标签:
每个测试案例包括两行:
第一行有1个整数n,表示数组的大小。1<=n <= 10^6。
第二行有n个整数,表示数组元素,每个元素均为int。
第三行有1个整数m,表示接下来有m次查询。1<=m<=10^3。
下面有m行,每行有一个整数k,表示要查询的数。
81 2 3 3 3 3 4 513
4
//source:http://ac.jobdu.com/problem.php?pid=1349
#include <iostream>
#include <cstdio>
using namespace std;
bool flag1 = true;
bool flag2 = true;
int SearchFirst(int A[], int n, int value)
{
int left = 0, right = n - 1;
while (left <= right)
{
int mid = (left + right)/2;
if (A[mid] < value)
left = mid + 1;
else if (A[mid] > value)
right = mid - 1;
else
{
if (A[mid - 1] != value || mid == 0)//mid==0
return mid;
else
right = mid - 1;
}
}
flag1 = false;
return 0;
}
int SearchLast(int A[],int n, int value)
{
int left = 0, right = n - 1;
while (left <= right)
{
int mid = (left + right)/2;
if (A[mid] < value)
left = mid + 1;
else if (A[mid] > value)
right = mid - 1;
else
{
if (A[mid + 1] != value || mid == n)//mid==n
return mid;
else
left = mid + 1;
}
}
flag2 = false;
return 0;
}
int main()
{
int n, m;//n是数组的大小,m是查询的次数
int k;//要查询的数
while (scanf("%d",&n)!=EOF)
{
int *array = new int[n+1];
for (int i = 0; i < n; i++)
{
scanf("%d", array+i);
}
scanf ("%d",&m);
while (m--)
{
scanf("%d",&k);
int first =SearchFirst(array,n,k);
int last = SearchLast(array,n,k);
if (!flag1 && !flag2)
printf("0\n");
else
printf("%d\n",last - first + 1);
}
}
return 0;
}标签:
原文地址:http://blog.csdn.net/hnuzengchao/article/details/44816559