## 題目描述
出題是一件痛苦的事情!
相同的題目看多了也會有審美疲勞,于是我舍棄了大家所熟悉的 A+B Problem,改用 A-B 了哈哈!
好吧,題目是這樣的:給出一串數以及一個數字 C,要求計算出所有 A - B = C 的數對的個數(不同位置的數字一樣的數對算不同的數對)。
## 輸入格式
輸入共兩行。
第一行,兩個整數 N, C。
第二行,N 個整數,作為要求處理的那串數。
## 輸出格式
一行,表示該串數中包含的滿足 A - B = C 的數對的個數。
## 輸入輸出樣例
**輸入 #1**
```
4 1
1 1 2 3
```
**輸出 #1**
```
3
```
## 說明/提示
對于 75% 的數據,`$ 1 \leq N \leq 2000 $`。
對于 100% 的數據,`$ 1 \leq N \leq 2 \times 10^5 $` 。
保證所有輸入數據絕對值小于 `$ 2^{30} $` ,且 `$ C \ge 1 $` 。
## 題目分析
題目要求計算出所有 A - B = C 的數對的個數(不同位置的數字一樣的數對算不同的數對)。已知C,此時轉換下等式可得到 A - C = B。我們可以嘗試利用單調性對齊進行處理,若A呈單調增,由于C的值固定,所以B也是單調增的。我們可以提前對所有的數進行升序排列,以遍歷到的`a[i]`作為A,我們去統計與之匹配的`a[i]-C`的個數,由于排序過,所以所有能匹配的`a[i]-C`一定是連續的。
而由于單調性,`a[i]` 確定的答案區間`$ l_i \sim r_i $` 一定是與 `a[i-1]`確定的答案區間`$ l_{i-1}\sim r_{i-1} $` 重疊或者在其右側。這就不需要重復在`$ 1\sim n $` 的范圍內尋找和`a[i]` 對應的 `a[i]-C`了,只需在之前答案的基礎上往后找即可,這塊的復雜度為`$ O(n) $`的復雜度,整體復雜度為`$ O(nlogn) $`。
## 代碼實現
```cpp
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=2e5+5;
int a[N];
int n,c;
//a-b=c => a-c=b
int main(){
cin>>n>>c;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+n+1);
int l=1,r=1;
long long sum=0;
for(int i=1;i<=n;i++){
int B=a[i]-c;
while(r<=n && a[r]<=B) r++;
while(l<=r && a[l]<B) l++;
sum+=(r-l);
}
cout<<sum;
return 0;
}
```