この週末、やたら初~中級の問題解いてるな。
https://atcoder.jp/contests/abc166/tasks/abc166_e
問題
整数列Aが与えられる。
(i,j)(i<j)の対のうち、j-i=A[i]+A[j]となるのは何通りか。
解法
式を変形するとj-A[j]=A[i]+iとなる。
そこでAを添え字の小さい順に処理し、A[i]+iの登場回数を覚えておけばよい。
int N; ll A; void solve() { int i,j,k,l,r,x,y; string s; ll ret=0; map<ll,int> M; cin>>N; FOR(i,N) { cin>>A; ret+=M[i-A]; M[i+A]++; } cout<<ret<<endl; }
まとめ
Dでもいいぐらいの問題な気がする。