上手に式変形しよう!
問題概要
正の整数からなるサイズ の数列 が与えられる。次の条件を満たす組 の個数を求めよ。
制約
考えたこと
条件が不思議だ。普通は よりも の方が大きいことが多いのに、 となる条件を問うとは。
さて、この手の数式を見たときに考えるべきことは「左辺は だけ、右辺は だけというように式変形する」ということだ。次のようになる。
⇔
この式が示すことは、次のようなことだ。
各 に対して、 としたとき、 を満たす (\lt j) の個数を合算していけばよい
この処理は map
などを用いてできる。計算量は となる。
コード
#include <bits/stdc++.h> using namespace std; // Ai + Aj = j - i // Ai + i = j - Aj int main() { int N; cin >> N; vector<long long> A(N); for (int i = 0; i < N; i++) cin >> A[i]; map<long long, long long> Aplus; for (int i = 0; i < N; i++) Aplus[A[i] + i]++; long long res = 0; for (int j = 0; j < N; j++) { res += Aplus[j - A[j]]; } cout << res << endl; }