a[i] + a[j] = M and 1<=i < j <=N.
初始的顺序其实没有关系
排序以后,对于要查找与a[i]匹配的值,范围[0,i-1].
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map>
#include <cmath>
#include <set>
#include <queue>
using namespace std;
const int INF=1e9+10;
const double EPS = 1e-10;
typedef long long ll;
const int mod=1e9+7;
int a[100005];
int main(){
int n,m;
while(scanf("%d %d",&n,&m)!=EOF){
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
ll cnt=0;
sort(a,a+n);
for(int i=0;i<n;i++){
int l=lower_bound(a,a+i,m-a[i])-a;
int r=upper_bound(a,a+i,m-a[i])-a;
cnt+=1LL*(r-l);
}
printf("%I64d\n",cnt);
}
return 0;
}