传送门
You are given an array a of n integers. Count the number of pairs of indices (i,j) such that i<j and aj−ai=j−i.
Input
The first line contains one integer t (1≤t≤104). Then t test cases follow.
The first line of each test case contains one integer n (1≤n≤2⋅105).
The second line of each test case contains n integers a1,a2,…,an (1≤ai≤n) — array a.
It is guaranteed that the sum of n over all test cases does not exceed 2⋅105.
Output
For each test case output the number of pairs of indices (i,j) such that i<j and aj−ai=j−i.
思路:
若aj-ai == j-i,那么aj-j一定等于ai-i。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll a[200010];
map<ll,ll>vis;
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
for(int i = 1; i <= n; i++)
{
scanf("%lld",&a[i]);
a[i] = a[i]-i;
vis[a[i]]++;
}
ll ans = 0;
for(int i = 1; i <= n; i++)
{
if(vis[a[i]] != 0)
{
ans += vis[a[i]]*(vis[a[i]]-1)/2;
vis[a[i]] = 0;
}
}
printf("%lld\n",ans);
vis.clear();
memset(a,0,sizeof(a));
}
}