kmjp's blog

競技プログラミング参加記です

AtCoder ABC #166 : E - This Message Will Self-Destruct in 5s

この週末、やたら初~中級の問題解いてるな。
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でもいいぐらいの問題な気がする。