まぁこれはね。
https://codingcompetitions.withgoogle.com/codejam/round/000000000019fef2/00000000002d5b63
問題
(2*10^9)*(2*10^9)の領域のうち、どこかの格子点を中心都市、半径5*10^8以上10^9以下の円がある。
座標を指定すると、それが円内かどうかを返すクエリを300回まで用いて、中心を求めよ。
解法
これと同じだね。
第3回 ドワンゴからの挑戦状 本選 : C - ドワンGo - kmjp's blog
int T,A,B; void solve(int _loop) { int f,i,j,k,l,x,y; string s; int cx,cy; for(cx=-1000000000;cx<=1000000000;cx+=350000000) { for(cy=-1000000000;cy<=1000000000;cy+=350000000) { cout<<cx<<" "<<cy<<endl; cin>>s; if(s=="CENTER") return; if(s=="HIT") goto out; } } out: int L=cx,R=cx; for(i=30;i>=0;i--) { if(R+(1<<i)<=1000000000) { cout<<(R+(1<<i))<<" "<<cy<<endl; cin>>s; if(s=="CENTER") return; if(s=="HIT") R+=1<<i; } if(L-(1<<i)>=-1000000000) { cout<<(L-(1<<i))<<" "<<cy<<endl; cin>>s; if(s=="CENTER") return; if(s=="HIT") L-=1<<i; } } cx=(ll)(R+L)/2; int U=cy,D=cy; for(i=30;i>=0;i--) { if(D+(1<<i)<=1000000000) { cout<<cx<<" "<<(D+(1<<i))<<endl; cin>>s; if(s=="CENTER") return; if(s=="HIT") D+=1<<i; } if(U-(1<<i)>=-1000000000) { cout<<cx<<" "<<(U-(1<<i))<<endl; cin>>s; if(s=="CENTER") return; if(s=="HIT") U-=1<<i; } } cy=(ll)(U+D)/2; cout<<cx<<" "<<cy<<endl; cin>>s; assert(s=="CENTER"); return; }
まとめ
Aより楽だった。