Use binary search ..
# Include <stdio. h>
# Include <stdlib. h>
# Include <algorithm>
# Include <string. h>
# Include <istream>
Using namespace STD;
Int A [100010], visit [100010];
// Binary
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 ());
Scanf ("% 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 ++;
/* If this for loop is used, 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;
}