# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
625363 | Stavab | Aliens (IOI07_aliens) | C++14 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <iostream>
using namespace std;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n, x0, y0;
cin >> n >> x0 >> y0;
int t = 1;
while(1)
{
if(x0 - t > 0)
cout << "examine " << x0 - t << " " << y0;
else
break;
string s;
cin >> s;
if(s)
t *= 2;
else
break;
}
int low = max(x0 - t, 0);
int high = x0;
while(high - low > 2)
{
int middle = (low + high) / 2;
cout << "examine " << middle << " " << y0;
string s;
cin >> s;
if(s)
high = middle;
else
low = middle;
}
int xL = high;
t = 1;
while(1)
{
if(x0 + t <= n)
cout << "examine " << x0 + t << " " << y0;
else
break;
string s;
cin >> s;
if(s)
t *= 2;
else
break;
}
int low = x0;
int high = min(x0 + t, n + 1);
while(high - low > 2)
{
int middle = (low + high) / 2;
cout << "examine " << middle << " " << y0 << endl;
string s;
cin >> s;
if(s)
low = middle;
else
high = middle;
}
int xR = low;
int m = xR - xL + 1;
t = 1;
while(1)
{
if(y0 + t <= n)
cout << "examine " << x0 << " " << y0 + t << endl;
else
break;
string s;
cin >> s;
if(s)
t *= 2;
else
break;
}
int low = y0;
int high = min(y0 + t, n + 1);
while(high - low > 2)
{
int middle = (low + high) / 2;
cout << "examine " << x0 << " " << middle << endl;
string s;
cin >> s;
if(s)
low = middle;
else
high = middle;
}
int yU = low;
int yD = yU - m + 1;
int middleX = (xR + xL) / 2;
int middleY = (yU + yD) / 2;
int cornerX = middleX;
string s;
while(1)
{
if(cornerX + 2*m < n)
cout << "examine " << cornerX + 2*m << " " << middleY << endl;
else
break;
cin >> s;
if(s)
cornerX += 2*m;
else
break;
}
int cornerY = middleY;
while(1)
{
if(cornerY + 2*m < n)
cout << "examine " << middleX << " " << cornerY + 2*m << endl;
else
break;
cin >> s;
if(s)
cornerY += 2*m;
else
break;
}
cout << "solution " << cornerX - 2*m - m/2 << " " << cornerY - 2*m - m/2 << endl;
return 0;
}