传送门
思路一:
排序 + 二分:
A - B = C => B = A - C,那么对于每一个 A ,我们去寻找合适的 B 即可.
参考代码:
#include <iostream>
#include <algorithm>
#include <vector>
using ll = long long;
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
ll n, c, ans{};
std::cin >> n >> c;
std::vector<int> a(n);
for (int i = 0; i < n; i++) {
std::cin >> a[i];
}
std::sort(a.begin(),a.end());
for (int i = 0; i < n; i++) {
ans += std::upper_bound(a.begin(), a.end(), a[i] - c) - std::lower_bound(a.begin(), a.end(), a[i] - c);
}
std::cout << ans;
return 0;
}
思路二:尺取法(双指针):
#include <bits/stdc++.h>
using ll = long long;
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int n, c;
std::cin >> n >> c;
ll ans{};
std::vector<int> a(n);
for (int i = 0; i < n; i++) {
std::cin >> a[i];
}
int l{}, r{};
std::sort(a.begin(), a.end());
for (int i = 0; i < n; i++) {
int b = a[i] - c;
while (r < n && a[r] <= b)
r++;
while (l < r && a[l] < b)
l++;
ans += (r - l);
}
std::cout << ans;
return 0;
}