P1102 A-B數對題解
阿新 • • 發佈:2021-07-22
#include <bits/stdc++.h> using namespace std; typedef long long LL; const int N = 200010; int a[N]; int n, c; LL cnt; //累加和不加long long 死翹翹 int main() { //輸入 cin >> n >> c; for (int i = 1; i <= n; i++) cin >> a[i]; //排序 sort(a + 1, a + 1 + n); //遍歷每一個數字 for (int i = 1; i < n; i++) { //每個數字可能都是多個,我們不能漏掉每個數字 int left = 0, right = 0; //左端點 int l = 1, r = n, k = a[i] + c;//k為目標值 while (l < r) { int mid = (l + r) >> 1; if (a[mid] >= k)r = mid; else l = mid + 1; } if (a[l] == k)left = l; //右端點 l = 1, r = n; while (l < r) { int mid = (l + r + 1) >> 1; if (a[mid] <= k)l = mid; else r = mid - 1; } if (a[l] == k) right = r; //左右端點差就是個數,其實left如果不是0,那麼right肯定不是0 if (left && right) cnt += right - left + 1; } //輸出結果 printf("%lld", cnt); return 0; }