ABC 166 E - This Message Will Self-Destruct in 5s
ABC 166 E - This Message Will Self-Destruct in 5s についてのメモを残します。
立式、変数の分離
参加者 と で取引できる条件は、 である。
ここで、 という条件をつけると、 と表せる。
かつ を満たす の組の総数を求めたい。
下図は、入力例 1 の 、 における と を表す。参加者の番号は としている。
実装では、 を固定し、条件を満たす の個数を数える。
について、 とする。 の範囲で、 の値が となる の個数を数えるとよい。
#include <bits/stdc++.h> using namespace std; int main() { int N; cin >> N; vector<int> A(N); for (int i = 0; i < N; i++) cin >> A.at(i); long long ans = 0; map<int, int> M; // i + A[i] と その個数 // j について全探索 for (int i = 0; i < N; i++) { // j - A[j] = X とする int X = i - A.at(i); // i + A[i] = X となる i (i < j) の個数を加算 if (M.count(X)) ans += M[X]; // map に参加者 i の i + A[i] を追加 if (M.count(i + A.at(i))) M[i + A.at(i)]++; else M[i + A.at(i)] = 1; } cout << ans << endl; }