用二分查找。。
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <string.h>
#include <istream>
using namespace std;
int A[100010],visit[100010];
//二分
int find(int l, int r, int v)
{
int mid;
while (l <= r)
{
//printf("****");
mid = (l + r) / 2;
if( A[mid] == v)
return mid;
else if ( v < A[mid])
r = mid - 1;
else
l = mid + 1;
}
return 0;
}
int main( )
{
int T, M, N, num, i, j=0, k, flag = 0;
scanf("%d", &T);
while (T--) {
num = 0;
flag = 0;
j = 0;
memset(visit, 0, sizeof(visit));
memset(visit, 0, sizeof(A));
scanf("%d%d", &M, &N);
for (i = 0; i < M; i++)
scanf("%d", &A[i]);
sort(A, A+M);
M = unique(&A[0],&A[0]+M) - &A[0]; //stl
for(i = 0; i < M; i++) {
if(!visit[i] && A[i] * 2 != N)
j=find(i, M, N-A[i]);
//printf("%d\n",j);
if(j) {
visit[j] = 1, num++;
/* 如果用此for循环,则TLE
for (k = i; k < M; k++)
if(A[k] == A[i] || A[j] == A[k] )
visit[k] = 1;
else if ( A[k] > A[j] )
break;
*/
}
if(A[i] * 2 == N)
flag = 1;
j=0;
}
num = 2 * num;
if (flag) num++;
printf("%d\n", num);
}
return 0;
}