上手に式変形しよう!
問題概要
正の整数からなるサイズ の数列
が与えられる。次の条件を満たす組
の個数を求めよ。
制約
考えたこと
条件が不思議だ。普通は よりも
の方が大きいことが多いのに、
となる条件を問うとは。
さて、この手の数式を見たときに考えるべきことは「左辺は だけ、右辺は
だけというように式変形する」ということだ。次のようになる。
⇔
この式が示すことは、次のようなことだ。
各 に対して、
としたとき、
を満たす
(\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; }