This Message Will Self-Destruct in 5s
問題
E – This Message Will Self-Destruct in 5s
プログラミング初級者から上級者まで楽しめる、競技プログラミングコンテストサイト「AtCoder」。オンラインで毎週開催プログラミングコンテストを開催しています。競技…
記録
- 2021/1/26 解法わからず。
解法
- \(j – i = A[j] + A[i]\) より \(j – A[j] = i + A[i]\) となり、\(i\) と \(j\) で独立して考えることができる。
map
で \(j – A[j]\) の数を数えておいて、\(i\) ( \(0\) から \(N\) まで) について \(i + A[i]\) を求め、map
の数を足していく。
コード例
#include <bits/stdc++.h> using namespace std; #include <atcoder/all> using namespace atcoder; using ll = long long; using P = pair<int, int>; #define rep(i, n) for(int i = 0; i < (n); ++i) // using mint = modint998244353; // using mint = modint1000000007; // const int mod = 1000000007; // const ll INF = 1LL << 62; // const int INF = 1001001001; /** * 1 2 3 4 5 6 * 2 3 3 1 3 1 * * j - i = A[j] + A[i] * j - A[j] = A[i] + i * * -1 -1 0 3 2 5 * 3 5 6 5 8 7 */ int main() { int N; cin >> N; vector<ll> A(N); rep(i, N) { cin >> A[i]; } map<ll, ll> mp; rep(i, N) { ll v1 = i - A[i]; mp[v1]++; } ll ans = 0; rep(i, N) { ll v1 = i + A[i]; ans += mp[v1]; } cout << ans << endl; return 0; }