답안 #233868

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
233868 2020-05-22T05:20:07 Z T0p_ Aliens (IOI07_aliens) C++14
40 / 100
7 ms 384 KB
#include<bits/stdc++.h>
using namespace std;

map<pair<int, int>, bool> check;

bool examine(long long a, long long b)
{
	if(check.count({a, b})) return check[{a, b}];
	printf("examine %lld %lld\n",a,b);
	fflush(stdout);
	char str[7];
	scanf(" %s",str);
	return check[{a, b}] = (str[0] == 't') ? true : false;
}

void solution(long long a, long long b)
{
	printf("solution %lld %lld\n",a,b);
	fflush(stdout);
}

int main()
{
	long long n, x, y, l, r, L, R, T, B, sz;
	scanf(" %lld %lld %lld",&n,&x,&y);

	//right
	l = x, r = n;
	while(l != r)
	{
		long long mid = (l+r+1)>>1ll;
		if(!examine(mid, y)) r = mid-1;
		else if(!examine((l+mid)>>1ll, y)) r = mid-1;
		else if(!examine((l+((l+mid)>>1ll))>>1ll, y)) r = mid-1;
		else l = mid;
	}
	R = l;

	//left
	l = 1, r = x;
	while(l != r)
	{
		long long mid = (l+r)>>1ll;
		if(!examine(mid, y)) l = mid+1;
		else if(!examine((mid+r)>>1ll, y)) l = mid+1;
		else if(!examine((((mid+r)>>1ll)+r)>>1ll, y)) l = mid+1;
		else r = mid;
	}
	L = l;

	//top
	l = y, r = n;
	while(l != r)
	{
		long long mid = (l+r+1)>>1ll;
		if(!examine(x, mid)) r = mid-1;
		else if(!examine(x, (l+mid)>>1ll)) r = mid-1;
		else if(!examine(x, (l+((l+mid)>>1ll))>>1ll)) r = mid-1;
		else l = mid;
	}
	T = l;

	sz = R-L+1;
	B = T-sz+1;
	long long mx = (L+R)>>1ll, my = (B+T)>>1ll;
	int tl = 0, tr = 0, bl = 0, br = 0;
	for(int i=1 ; i<=4 ; i++)
	{
		if(mx - i*sz >= 1 && my + i*sz <= n && examine(mx-i*sz, my+i*sz)) tl++;
		if(mx + i*sz <= n && my + i*sz <= n && examine(mx+i*sz, my+i*sz)) tr++;
		if(mx - i*sz >= 1 && my - i*sz >= 1 && examine(mx-i*sz, my-i*sz)) bl++;
		if(mx + i*sz <= n && my - i*sz >= 1 && examine(mx+i*sz, my-i*sz)) br++;
	}
	if(tl == 0)
	{
		if(tr == 4) solution(mx+2*sz, my+2*sz);
		else if(bl == 4) solution(mx-2*sz, my-2*sz);
		else if(br == 4) solution(mx+2*sz, my-2*sz);
		else if(tr == 2) solution(mx+sz, my);
		else solution(mx, my-sz);
	}
	else if(tl == 1)
	{
		if(tr == 3) solution(mx+sz, my+sz);
		else if(bl == 3) solution(mx-sz, my-sz);
		else solution(mx+sz, my-sz);
	}
	else if(tl == 2)
	{
		if(bl + br == 0) solution(mx, my+sz);
		else if(bl + br == 2) solution(mx-sz, my);
		else solution(mx, my);
	}
	else if(tl == 3) solution(mx-sz, my+sz);
	else solution(mx-2*sz, my+2*sz);
	return 0;
}

Compilation message

aliens.cpp: In function 'bool examine(long long int, long long int)':
aliens.cpp:12:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf(" %s",str);
  ~~~~~^~~~~~~~~~~
aliens.cpp: In function 'int main()':
aliens.cpp:25:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf(" %lld %lld %lld",&n,&x,&y);
  ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 5 ms 256 KB Incorrect
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 5 ms 256 KB Incorrect
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 256 KB Output is correct
2 Correct 5 ms 256 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 256 KB Output is correct
2 Correct 7 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 5 ms 256 KB Incorrect
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 256 KB Output is correct
2 Correct 6 ms 256 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 5 ms 256 KB Incorrect
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 6 ms 256 KB Incorrect
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 384 KB Output is correct
2 Incorrect 6 ms 376 KB Incorrect
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 256 KB Output is correct
2 Correct 6 ms 384 KB Output is correct
3 Correct 7 ms 384 KB Output is correct