#include <iostream>
#include <string>
#include <unordered_map>
#include <algorithm>
using namespace std;
#define ll long long
//1.开ll,不然会WA
unordered_map<ll, ll> vis;
//2.假定这里写int,int,后面需要类型转换,否则会爆int
int main() {
int t;
cin >> t;
while (t--) {
vis.clear();
int n;
cin >> n;
ll a;
for (int i = 1; i <= n; i++) {
cin >> a;
vis[a - i]++;
}
ll ans = 0;
unordered_map<ll, ll>::iterator it;
//3.开迭代器
for (it = vis.begin(); it != vis.end(); it++) {
//4.迭代器遍历是使用地址遍历
//5.指针不能用<,因此写成it!=vis.end()
ans += it->second * (it->second - 1) / 2;
}
cout << ans << endl;
}
return 0;
}
需类型转换的代码
#include <iostream>
#include <string>
#include <unordered_map>
#include <algorithm>
using namespace std;
#define ll long long
unordered_map<int, int> vis;
int main() {
int t;
cin >> t;
while (t--) {
vis.clear();
int n;
cin >> n;
ll a;
for (int i = 1; i <= n; i++) {
cin >> a;
vis[a - i]++;
}
ll ans = 0;
unordered_map<int, int>::iterator it;
for (it = vis.begin(); it != vis.end(); it++) {
ans += (ll)it->second * (ll)(it->second - 1) / 2;
//或者这样写: ans += (ll)it->second * (it->second - 1) / 2;
}
cout << ans << endl;
}
return 0;
}