競技プログラミング日記

主に AtCoder の記事です

AtCoder Beginner Contest 166E

ABC166E

相異なる \(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;
}