题目大意:
给你t个样例
每个样例有一个数字n
同时有n个数字ai
这些数字中按顺序每个数字下标为1,2,3······
问你有多少组数字右边下标-左边下标等于右边数字的值-左边数字的值
思路:
首先开始想暴力,但一看数据范围10e9暴力n2肯定过不了
那么我们就可以这样想,能不能将每个数字对应的值全部都压到一个点上
限于作者水平不好表达,这里举例说明
设一个数字为aj
那么它在位置0对应的数字就是aj
-j
而每个数字都在位置0上有对应的数字
如果对应的数字相同那么就说明了他们是一组的
可以设两个数字aj
与ai
并且j>i
则aj
-ai
=j-i
那么aj
-j=ai
-i
左边右边加多少减多少等式都成立
就这样我们就可以按这个公式统计答案
同时要注意这里要用map防止出现下标为负数的情况(不然左右两边加上2e5用数组也可以)
可能限于本人还有解释不清楚的地方
具体看代码
#include <iostream>
#include <string.h>
#include <map>
typedef long long ll;
using namespace std;
int main()
{
int n;
cin>>n;
while(n--){
int t;
ll ans=0;
map<int,int>a;
cin>>t;
for(int i=0;i<t;i++){
int b;
cin>>b;
ans+=a[b-i]++;
}
cout<<ans<<endl;
}
return 0;
}