kmjp's blog

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

Google Code Jam 2020 Round 1B : B. Blindfolded Bullseye

まぁこれはね。
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より楽だった。