E - This Message Will Self-Destruct in 5s Editorial by ward1302


この問題で、条件を満たすかどうかを全てのペアについて一つずつ確かめるのは、計算量が \( O (N^2) \) となるため不可能です。
ここで、参加者 \( i \)\( j \) のペア ( ただし \( i < j \) とする ) について、数え上げの条件を数式で表してみると、

\[ j - i = A_i +A_j \]

となり、これを変形すると、

\[ i + A_i = j - A_j \]

となります。
このことから、例えば「十分な長さの配列 \( B \) を用意し、最初にその要素を全て \( 0 \) で初期化する。\( A \) の添字 \( i \) を小さい方から順に見ていき、『\( B[i-A_i] \) のその時点での値を答えに加え、\( B[i+A_i] \) をインクリメントすること』を繰り返す」というような解法が成立することがわかります。この解法の計算量は \( N \) について線形であるので、十分間に合います。あとは、配列外参照などに気をつけて実装をしましょう。

posted:
last update: