kmjp's blog

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

Codeforces #707 Div1 : A. Going Home

3問早解きで割と良い結果となった回。
https://codeforces.com/contest/1500/problem/A

問題

整数列Aが与えられる。いずれも値は2500000以下の正整数である。
A[x]+A[y]=A[z]+A[w]となる異なる添え字(x,y,z,w)があれば1つ求めよ。

解法

A[x]+A[y]の値は高々5*10^6通りである。
そこで鳩ノ巣原理の要領で、(x,y)を総当たりし、A[x]+A[y]の値に対応する添え字の対(x,y)を覚えておこう。
A[x]+A[y]=A[x']+A[y']かつ互いに異なるx,y,x',y'の組がいずれ見つかる。

int N;
int A[202020];
pair<int,int> P[5050505];
void solve() {
	int i,j,k,l,r,x,y; string s;
	
	MINUS(P);
	
	cin>>N;
	FOR(i,N) {
		cin>>A[i];
		FOR(j,i) {
			x=A[i]+A[j];
			if(P[x].first>=0&&P[x].first!=j&&P[x].second!=j) {
				cout<<"YES"<<endl;
				cout<<(i+1)<<" "<<(j+1)<<" "<<P[x].first+1<<" "<<P[x].second+1<<endl;
				return;
			}
		}
		FOR(j,i) {
			x=A[i]+A[j];
			P[x]={i,j};
		}
	}
	cout<<"NO"<<endl;
	
}

まとめ

なぜこの問題に対しGoing Homeという名前を付けたのだろう。