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という名前を付けたのだろう。