话说今天本来想做福大月赛,但被队长叫去做新秀杯,被虐出内伤。
但回来还是要做月赛的题,E题纯粹考查二分,写了半天,最近写代码好慢,幸好1A。
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<set>
using namespace std;
int a[100010],n,m;
inline int read() // 0 or pos or neg
{
char ch;
int num, flag= 1;
while( ch= getchar(), ch== ' ' || ch== '\n' );
if( ch== '-' )
flag= -1,num= 0;
else
num=ch- '0';
while( ch= getchar(), ch>= '0' && ch<= '9' )
num= num* 10+ ch- '0';
return num* flag;
}
int bsearchFirst(int i,int k)//找 >= K 的第一个位置,不一定有解
{
int ans=-1,mid,low=i+1,high=n-1;
while(low<=high)
{
mid=(low+high)/2;
if(a[mid]>=k)
{
ans=mid;
high=mid-1;
}
else
low=mid+1;
}
if(ans == -1)
return -1;
if(a[ans] == k)
return ans;
else
return -1;
}
int bsearchLast(int i,int k)//找 <= K 的最后一个位置,不一定有解
{
int ans=-1,low=i,high=n-1; // no answer first
while(low<=high)
{
int mid=(low+high) /2;
if(a[mid]<= k)
{
ans=mid;
low=mid+1;
}
else
high=mid-1;
}
return ans;
}
int main()
{
int i,ii,jj;
long long cnt;
while(scanf("%d %d",&n,&m)!=EOF)
{
for(i=0;i<n;i++)
a[i]=read();
sort(a,a+n);
for(i=0,cnt=0;i<n;i++)
{
ii=bsearchFirst(i,m-a[i]);
if(ii == -1 || ii<i)
continue;
jj=bsearchLast(i,m-a[i]);
if(jj<ii || jj == -1)
continue;
cnt+=jj-ii+1;
}
printf("%lld\n",cnt);
}
return 0;
}