2都做了,把1补上。
题意给出n和k,还有n个数。就是n个数中 找出两个数x,y。使得 x+y=k。
计算所有的可能。当x0+y0=k。x1+y1=k 。 必须有不相等的。 x0!=x1 or y0!=y1。
例如
4 4
2 2 2 2
正确输出应该是 1 。
我是排序,去重,然后二分。貌似很多人都是用 two pointers。
忘了stl的二分返回下标的函数了,心情不好,懒得去查,手打二分。
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<map>
#include<stack>
#include<iostream>
#include<list>
#include<set>
#include<bitset>
#include<vector>
#include<cmath>
#define INF 0x7fffffff
#define eps 1e-8
#define LL long long
#define PI 3.141592654
#define CLR(a,b) memset(a,b,sizeof(a))
#define FOR(i,a,b) for(int i=a;i<b;i++)
#define FOR_(i,a,b) for(int i=a;i>=b;i--)
#define sf scanf
#define pf printf
#define all(v) (v).begin(),(v).end()
#define acfun std::ios::sync_with_stdio(false)
#define SIZE (100000 +2)
#define MOD 1000000007
using namespace std;
int binsearch(int *a,int l,int r,int key)
{
while(l<=r)
{
int m=(l+r)>>1;
if(a[m]==key)
return m;
else if(a[m]>key)
r=m-1;
else
l=m+1;
}
return -1;
}
int main()
{
int t;
sf("%d",&t);
while(t--)
{
int n,m;
sf("%d%d",&n,&m);
int a[SIZE];
FOR(i,0,n)
sf("%d",&a[i]);
sort(a,a+n);
int cnt =unique(a,a+n)-a;
int ans=0;
FOR(i,0,cnt)
{
if(a[i]<=m&&binsearch(a,0,cnt-1,m-a[i])!=-1)
ans++;
}
pf("%d\n",ans);
}
}