链接:
https://codeforces.com/problemset/problem/1520/D
题意:
给一串数组,计算有多少组数i,j满足i<j and aj?ai=j?i。
本题记录每一个数对于自己位置的偏移量,相同的偏移量意味着,两个数可以组成一组。最后从每个相同偏移量的数字里选两个,可以用数学排列组合的公式计算C52.即cnt*(cnt-1)/2。
代码如下:
#include<iostream>
#include<vector>
#include<cmath>
#include<set>
#include<map>
#include<algorithm>
#include<string>
#include<string.h>
#include<random>
#include<queue>
using namespace std;
typedef long long ll;
ll a[200003];
ll dis[200003];
map<ll, ll>mp;
int main() {int T;cin >> T;while (T--) {mp.clear();int n;cin >> n;for (int i = 1; i <= n; i++) {cin >> a[i];dis[i] = a[i] - i;mp[dis[i]]++;}ll ans = 0;for (auto i : mp) {ans += i.second * (i.second - 1) / 2;}cout << ans;cout << endl;}return 0;
}