题目描述
出题是一件痛苦的事情!
题目看多了也有审美疲劳,于是我舍弃了大家所熟悉的A+B Problem,改用A-B了哈哈!
好吧,题目是这样的:给出一串数以及一个数字C,要求计算出所有A-B=C的数对的个数。(不同位置的数字一样的数对算不同的数对)
输入输出格式
输入格式:
第一行包括2个非负整数N和C,中间用空格隔开。
第二行有N个整数,中间用空格隔开,作为要求处理的那串数。
输出格式:
输出一行,表示该串数中包含的所有满足A-B=C的数对的个数。
对于90%的数据,N <= 2000;
对于100%的数据,N <= 200000。
所有输入数据都在longint范围内。
输入输出样例
输入样例#1:
4 1 1 1 2 3
输出样例#1:
3
刚刚学会二分就用到了。= =兴奋ing
#include<iostream>
#include<string>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <map>
#include <cstdio>
using namespace std;
int a[1000000];
int main()
{
int n,c;
while(scanf("%d%d",&n,&c)!=EOF)
{
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
sort(a,a+n);
int sum=0;
int qq=1;
for(int i=0;i<=n;i++)
{
if(a[i]==a[i+1]) //加速- -
{
qq++;
//cout<<qq<<endl;
continue;
}
int l=i+1,h=n-1,mid;
while(l<=h) //二分大加速
{
mid=(l+h)/2;
if(a[mid]-a[i]>c) h=mid-1;
else if(a[mid]-a[i]<c) l=mid+1;
else break;
}
if(a[mid]-a[i]==c)
{
sum+=qq;
while(a[mid]==a[mid-1]) mid--;
while(a[mid]==a[mid+1])
{
sum+=qq;
mid++;
}
}
if(a[i]!=a[i+1]) qq=1;
}
printf("%d\n",sum);
}
}