每个测试案例包括两行:
第一行有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