相異なる \(i,j \in N\) の組を数える. これは典型で,\(i < j\) として \(j\) の方を全探索する. それにより,今 \(j\) を探索しているとき,すでに \(i < j\) については すべて調べ終わった状態になるため.
abs(j-i) = a[i] + a[j] より, j-i = a[i] + a[j]. これを i,j の式に分離すると, j - a[j] = i + a[i] \(\cdots (*)\).
よって,
ans = {(i,j) \(\in N \times N\) | i < j かつ j-i = a[i] + a[j]}
を求める代わりに,\((*)\) を満たす i の個数を数えればよい. これは map で記録しておけばよい.
使っている記号,マクロ等 "https://ecsmtlir.hatenablog.com/entry/2022/12/23/131925"
int main() {
ll n;
cin >> n;
vll a(n); rep(i,n) { cin >> a[i]; }
map<ll,ll> mp;
ll ans = 0;
rep(j,n){
ans += mp[j-a[j]];
mp[j+a[j]]++;
}
cout << ans << endl;
return 0;
}