제출 #1162150

#제출 시각아이디문제언어결과실행 시간메모리
1162150cnn008Aliens (IOI07_aliens)C++20
0 / 100
0 ms432 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n,X0,Y0,_x,_y,cnt;
signed main(){
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cin>>n>>X0>>Y0;
	auto ask = [&](int x, int y)->bool{
	    cnt++;
	    assert(cnt<=300);
		cout<<"examine "<<x<<" "<<y<<endl;
		string s;
		cin>>s;
		if(s[0]=='t') return 1;
		return 0;
	};
	int l1,r1,l2,r2;
	_x=X0,_y=Y0;
	for(int i=1; ; i*=2){
		int y=min(n,_y+i);
		if(!ask(X0,y)){
			int l=_y,r=y-1;
			while(l<=r){
				int mid=(l+r)>>1;
				if(ask(X0,mid)){
					r2=mid;
					l=mid+1;
				}else r=mid-1;
			}
			break;
		}else{
			if(y==n){
				r2=n;
				break;
			}
			_y+=i;
		}
	}
	_x=X0,_y=Y0;
	for(int i=1; ; i*=2){
		int x=min(n,_x+i);
		if(!ask(x,Y0)){
			int l=_x,r=x-1;
			while(l<=r){
				int mid=(l+r)>>1;
				if(ask(mid,Y0)){
					l2=mid;
					l=mid+1;
				}else r=mid-1;
			}
			break;
		}else{
			if(x==n){
				l2=n;
				break;
			}
			_x+=i;
		}
	}
	_x=X0,_y=Y0;
	for(int i=1; ; i*=2){
		int y=max(1ll,_y-i);
		if(!ask(X0,y)){
			int r=_y,l=y+1;
			while(l<=r){
				int mid=(l+r)>>1;
				if(ask(X0,mid)){
					r1=mid;
					r=mid-1;
				}else l=mid+1;
			}
			break;
		}else{
			if(y==1){
				r1=1;
				break;
			}
			_y-=i;
		}
	}
	_x=X0,_y=Y0;
	for(int i=1; ; i*=2){
		int x=max(1ll,_x-i);
		if(!ask(x,Y0)){
			int r=_x,l=x+1;
			while(l<=r){
				int mid=(l+r)>>1;
				if(ask(mid,Y0)){
					l1=mid;
					r=mid-1;
				}else l=mid+1;
			}
			break;
		}else{
			if(x==1){
				l1=1;
				break;
			}
			_x-=i;
		}
	}
	int m=r2-r1+1,cur=0;
	assert(m&1);
	int l=1,r=50000;
	auto check = [&](int x, int y)->bool{
		if(x<=0 || y<=0) return 0;
		return ask(x,y);
	};
//	while(l<=r){
//		int mid=(l+r)>>1;
//		if(check(l1-mid*m,r1-mid*m)){
//			cur=mid;
//			l=mid+1;
//		}else r=mid-1;
//	}
//	r1-=m*cur;
//	l1-=m*cur;
//	cur=0;
//	l=1,r=50000;
//	while(l<=r){
//		int mid=(l+r)>>1;
//		if(check(l1-2*mid*m,r1)){
//			cur=mid;
//			l=mid+1;
//		}else r=mid-1;
//	}
//	l1-=2*cur*m;
//	cur=0;
//	l=1,r=50000;
//	while(l<=r){
//		int mid=(l+r)>>1;
//		if(check(l1,r1-2*mid*m)){
//			cur=mid;
//			l=mid+1;
//		}else r=mid-1;
//	}
//	r1-=2*cur*m;
    assert(ask(l1,r1));
    while(check(l1-m-m,r1)) l1-=m+m;
    while(check(l1,r1-m-m)) r1-=m+m;   
    while(check(l1-m,r1-m)) l1-=m,r1-=m;
    assert(ask(l1,r1)); 
	l1+=(m-1)*m;
	r1+=(m-1)*m;
	l1+=m/2;
	r1+=m/2;
	int v=(m-1)*m+m/2;
    cout<<"solution "<<l1<<" "<<r1<<endl;
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...