题解 CF1520D 【Same Differences】
我们拿到
-
a_j-a_i=j-i -
a_j=j-i+a_i -
a_j-j=a_i-i
接下来,我们发现只需要计算这个数和下标的差就可以知道匹配个数了。
那么只需要开桶统计即可。这时候我们会发现
那么把凶狠的眼光放在 STL 上,发现 map 可以帮我们解决这个问题。map 的单次修改是
那么一共做
#include<iostream>
#include<map>
#define int long long
using namespace std;
signed main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
int a[n+1];
for(int i=1;i<=n;++i){
cin>>a[i];
a[i]-=i;
}
int ans=0;
map<int,int>m;
for(int i=1;i<=n;++i){
if(m.count(a[i]))
ans+=m[a[i]];
++m[a[i]];
}
cout<<ans<<endl;
}
}
数组:为什么我不行?
博主:谁说的!
我们注意到,所有减去的下标最多是
不过这时候,因为如果没有减出负数,加完
那么我们开
#include<iostream>
#include<algorithm>
#define int long long
using namespace std;
signed main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
int a[n+1];
for(int i=1;i<=n;++i){
cin>>a[i];
a[i]-=i;
}
int ans=0;
int m[2*n+1];
fill(m,m+2*n+1,0);
for(int i=1;i<=n;++i){
ans+=m[a[i]+n];
++m[a[i]+n];
}
cout<<ans<<endl;
}
}
因为查询数组是
这就是不会 STL 的同学可以走的取巧路线。题解就这么多了。