取数 | ||||||
| ||||||
Description | ||||||
有n个整数,给定一个数x,从n个数中取两个数,使得和刚好为x,问有多少种取法。 | ||||||
Input | ||||||
有多组测试数据。 对于每组测试数据,有两行,第一行有两个数n, x,第二行有n个数, a1, a2, a3 ... an。 0 < n <= 100000, 0 <= x <= 1000000000, -1000000000 <= ai <= 1000000000。 | ||||||
Output | ||||||
对于每组测试数据,输出一行,包含一个整数,有多少种取法。 | ||||||
Sample Input | ||||||
2 5 1 4 3 10 5 5 5 | ||||||
Sample Output | ||||||
1 3 | ||||||
Author | ||||||
万祥 |
#include <map>
#include <set>
#include <queue>
#include <cmath>
#include <stack>
#include <cctype>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#define rd(x) scanf("%d",&x)
#define rd2(x,y) scanf("%d%d",&x,&y)
#define rds(x) scanf("%s",x)
#define rdc(x) scanf("%c",&x)
#define ll long long
#define maxn 100005
#define mod 1000000007
#define INF 0x3f3f3f3f //int 最大值
#define FOR(i,f_start,f_end) for(int i=f_start;i<=f_end;++i)
#define MT(x,i) memset(x,i,sizeof(x))
#define PI acos(-1.0)
#define E exp(1)
using namespace std;
int main(){
int n;
ll a[100005],m;
while(cin>>n>>m){
ll cnt=0;
FOR(i,0,n-1)
cin>>a[i];
sort(a,a+n);
int low,high,mid,st,ed;
ll flag;
FOR(i,0,n-1){
flag=m-a[i];
low=i+1;high=n-1;
while(high>=low){
mid=(low+high)/2;
if(a[mid]<flag)low=mid+1;
else high=mid-1;
}
st=low;
low=i+1;
high=n-1;
while(high>=low){
mid=(low+high)/2;
if(a[mid]<=flag)low=mid+1;
else high=mid-1;
}
ed=low;
if(a[st]==flag&&a[ed-1]==flag)
cnt+=(ed-st);
}
cout<<cnt<<'\12';
}
return 0;
}
/**
2 5
1 4
3 10
5 5 5
**/