AT274の技術だったりなかったり

あっとのTECH LOG

競プロのこととか技術のこととか。たまに日常を書きます。

ABC166 E - This Message Will Self-Destruct in 5s

問題原文

atcoder.jp

解法

条件を整理すると、

 abs(i - j) = A_i + A_j

が探したいものだとわかる。

とりあえず  j > i として絶対値を消すと、

 j - i = A_i + A_j

になった。

こういうのは  i j を別々に考えるとよくて、式変形をすると

 i + A_i = j - A_j

が得られる。

これで左辺と右辺が独立に前計算できるようになった。
あとは全ての  i についてペアになれる  j がいくつあるかを数えればいい。
i = j で条件を満たすようなものはないので考えなくて大丈夫。

実装

from collections import Counter
N = int(input())
A = list(map(int, input().split()))

P = [i + a for i, a in enumerate(A, start=1)]
Q = [j - a for j, a in enumerate(A, start=1)]

ans = 0
QC = Counter(Q)
for p in P:
    ans += QC[p]

print(ans)

感想

あれ、なんか強くなってる気がする。