D. Same Differences
题目传送门:
题面:
题目大意:
给一堆数,问其中有几对满足
a
j
−
a
i
=
j
−
i
a_j-a_i=j-i
aj−ai=j−i
关键点在于将给定的公式变形。
变为
a
j
−
j
=
a
i
−
i
a_j-j=a_i-i
aj−j=ai−i
那就直接把数组存为
a
j
−
j
a_j-j
aj−j。相同的部分就是符合条件的总个数,然后对于每段相同的序列,用组合数学求有几对。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2e5 + 10;
int a[maxn];
int main() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int T;
cin >> T;
while (T--) {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
int temp;
cin >> temp;
temp -= i;
a[i] = temp;
// cout << a[i] << " ";
}
if (n == 1) {
cout << 0 << endl;
continue;
}
// cout << endl;
ll ans = 0;
ll cnt = 1;
sort(a + 1, a + 1 + n);
for (int i = 2; i <= n; i++) {
if (a[i - 1] == a[i]) cnt++;
if (i == n) {
ans += cnt * (cnt - 1) / 2;
break;
}
if (a[i - 1] != a[i]) {
ans += cnt * (cnt - 1) / 2;
cnt = 1;
}
}
cout << ans << endl;
}
}