P1102 A-B 数对 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
思路:
①map,键值对计数,将A-B->A-C
②先排序,找对应差值为C的第一个和最后一个计数
代码:
#include<iostream>
#include <map>
#include<algorithm>
#define ll long long
using namespace std;
ll N, C;
ll a[100005];
map<ll, ll> m;
int main()
{
cin >> N >> C;
for (int i = 1; i <= N; ++i)
{
cin >> a[i];
m[a[i]]++;//计数
a[i] -= C;//A-C=B
}
ll cnt = 0;
//for (int i = 1; i <= N; ++i)
//{
// cnt += m[a[i]];//所有可能
//}
//先排序,找到对应差值为C的第一个数和最后一个数,计数即可
sort(a + 1, a + N + 1);
for (int i = 1; i <= N; i++)
{
cnt += ((upper_bound(a + 1, a + N + 1, a[i] + C) - a) - (lower_bound(a + 1, a + N + 1, a[i] + C) - a));
}
cout << cnt;
return 0;
}