题目:
见https://www.luogu.com.cn/problem/P1102
思路:
其实很简单,A-B=C转化成A=B+C
然后对A或者B+C数组随意哪一个进行排序,然后再遍历没有排序的那个数组,然后进行二分查找,唯一麻烦的点就是在 不同位置的数字一样的数对算不同的数对。。。这个地方我搞了一会儿,详情见代码
代码:
#include<iostream>
#include<algorithm>
using namespace std;
const int N=200010;
typedef pair<int,int> PII;
int a[N],b[N],cnt[N];
int main()
{
int n,c;
cin>>n>>c;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
a[i]=x;
b[i]=x+c;
}
sort(a+1,a+n+1);
PII last;
last.first=a[1];
last.second=1;
cnt[1]++;
for(int i=2;i<=n;i++)//为了处理题目要求的问题,其实是为了防止超时
{
int t=last.first;
if(a[i]==t)
cnt[last.second]++;
else
{
last.first=a[i];
last.second=i;
cnt[i]++;
}
}
long long res=0;
for(int i=1;i<=n;i++)//一个简单的二分
{
int l=1,r=n;
while(l<r)
{
int mid=l+r>>1;
if(b[i]<=a[mid]) r=mid;
else l=mid+1;
}
if(b[i]==a[l])
res+=cnt[l];
}
cout<<res<<endl;
return 0;
}