本题为洛谷的P1102
题目背景
出题是一件痛苦的事情!
相同的题目看多了也会有审美疲劳,于是我舍弃了大家所熟悉的 A+B Problem,改用 A-B 了哈哈!
题目描述
给出一串正整数数列以及一个正整数 C,要求计算出所有满足 A - B = C 的数对的个数(不同位置的数字一样的数对算不同的数对)。
输入格式
输入共两行。
第一行,两个正整数 N,C。
第二行,N 个正整数,作为要求处理的那串数。
输出格式
一行,表示该串正整数中包含的满足 A - B = C 的数对的个数。
输入输出样例
输入 #1
4 1 1 1 2 3
输出 #1
3
说明/提示
对于 75\%75% 的数据,1≤N≤2000。
对于 100\%100% 的数据,1≤N≤2×10的5次方,0≤ai<2的30次方,1≤C<2的30次方。
#include<iostream>
#include<algorithm>
using namespace std;
int a[200000],n,c;
int first(int low,int high,int x){
int mid;
while(low<=high){
mid=(low+high)/2;
if(a[mid]<x) low=mid+1;
else high=mid-1;
}
if(low<n&&a[low]==x) return low;
else return -1;
}
int end(int low,int high,int x){
int mid;
while(low<=high){
mid=(low+high)/2;
if(a[mid]>x) high=mid-1;
else low=mid+1;
}
if(high>=0&&high<n&&a[high]==x) return high;
else return -1;
}
int main(){
int left,right;
long long s=0;
scanf("%d %d",&n,&c);
for(int i=0;i<n;i++) scanf("%d",&a[i]);
sort(a,a+n);
for(int j=0;j<n;j++){
left=first(j+1,n-1,a[j]+c);
if(left==-1) continue;
right=end(left,n-1,a[j]+c);
s+=right-left+1;
}
printf("%lld",s);
return 0;
}