P1102 A-B 数对
https://www.luogu.com.cn/problem/P1102
方法一:计数(只能拿92,有一个测试点过不了)
#include<bits/stdc++.h>
using namespace std;
int n, c, a[200005];
int b[1<<28];//注意数组最大下标
long long ans;
int main()
{
cin>>n>>c;
for(int i=0; i<n; i++)
cin>>a[i],b[a[i]]++;//注意a[i]的取值范围
sort(a, a+n);
for(int i=0; i<n; i++)
ans+=b[a[i]+c];//自动计数累加
cout<<ans;
return 0;
}
方法二:MAP
#include<cstdio>
#include<iostream>
#include<map>
using namespace std;
int a[200005];//桶存储每个出现过的数的次数
map<int,int> tong;
int main()
{
int n,c;
scanf("%d%d",&n,&c);
for(int i = 1;i <= n;++ i)
{
scanf("%d",&a[i]);
tong[a[i]] ++;//计数
}
long long js = 0;
for(int i = 1;i <= n;++ i)
{//这里倒着想不去找两个数而是找一个然后再找另一个
js += tong[a[i] + c];
}
printf("%lld\n",js);
return 0;
}
方法三:STL之lower_bound/upper_bound
#include<bits/stdc++.h>
using namespace std;
int n, c, a[200005];
long long ans;
int main()
{
cin>>n>>c;
for(int i=0; i<n; i++)
cin>>a[i];
sort(a, a+n);
for(int i=0; i<n; i++){
ans+=(upper_bound(a, a+n, a[i]+c)-a)-(lower_bound(a, a+n, a[i]+c)-a);
}
cout<<ans;
return 0;
}
方法四:双指针

浙公网安备 33010602011771号