#include<bits/stdc++.h> usingnamespace std; typedeflonglong ll; int n, c, x; map<int, int> mp;
intmain(){ ll ans = 0; cin >> n >> c; for (int i = 0; i < n; ++i) cin >> x, ++mp[x]; for (auto i : mp) { if (mp.count(i.first + c)) ans += 1ll * i.second * mp[i.first + c]; } cout << ans; return0; }
二分
根据a = b + c,排序后枚举b,以二分查找的形式得到满足条件的a个数,累加即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
#include<bits/stdc++.h> usingnamespace std; typedeflonglong ll; constint LEN = 2e5 + 50; int n, c, x, arr[LEN];
intmain(){ ll ans = 0; cin >> n >> c; for (int i = 0; i < n; ++i) cin >> arr[i]; sort(arr, arr + n); for (int i = 0; i < n - 1; ++i) { ans += upper_bound(arr, arr + n, arr[i] + c) - lower_bound(arr, arr + n, arr[i] + c); } cout << ans; return0; }
双指针
根据a - c = b,排序后可通过枚举a来得到b的值,且b一定小于a;所以用双指针来维护b出现的区间,
#include<bits/stdc++.h> usingnamespace std; typedeflonglong ll; constint LEN = 2e5 + 50; int n, l, r, c, arr[LEN];
intmain(){ ll ans = 0; cin >> n >> c; for (int i = 0; i < n; ++i) cin >> arr[i]; sort(arr, arr + n); for (int i = 0; i < n; ++i) { int a = arr[i], b = a - c; while (l < n && b > arr[l]) ++l; while (r < n && arr[r] <= b) ++r; if (arr[l] == b) ans += r - l; } cout << ans; return0; }