제출 #586705

#제출 시각아이디문제언어결과실행 시간메모리
586705Do_you_copyAliens (IOI07_aliens)C++14
80 / 100
4 ms320 KiB
#include <bits/stdc++.h>
#define taskname "test"
#define fi first
#define se second
#define pb push_back
#define faster ios_base::sync_with_stdio(0); cin.tie(0);
using namespace std;

using ll = long long;
using pii = pair <int, int>;

ll min(const ll &a, const ll &b){
    return (a < b) ? a : b;
}

ll max(const ll &a, const ll &b){
    return (a > b) ? a : b;
}

const ll Mod = 1000000007;
const int maxN = 1e5 + 1;
int n, x, y;
bool t;

bool ask1(int x, int y, int d){
    if (x + d > n || x + d < 1) return 0;
    cout << "examine " << x + d << " " << y << endl;
    string s; cin >> s;
    return s == "true";
}

bool ask2(int x, int y, int d){
    if (y + d > n || y + d < 1) return 0;
    cout << "examine " << x << " " << y + d << endl;
    string s; cin >> s;
    return s == "true";
}

void Init(){
    cin >> n >> x >> y;
    int rx = x, currentx = x;
    for (int i = 0; i < 32; ++i){
        currentx = x + (1 << i);
        currentx = min(n, currentx);
        cout << "examine " << currentx << " " << y << endl;
        string s; cin >> s;
        t = s == "true";
        if (!t || currentx == n) break;
        rx = currentx;
    }
    if (currentx == n && t) rx = n;
    else{
        while (rx <= currentx){
            int m = (rx + currentx) / 2;
            cout << "examine " << m << " " << y << endl;
            string s; cin >> s;
            t = s == "true";
            if (t) rx = m + 1;
            else currentx = m - 1;
        }
        rx = currentx;
    }
    int ry = y, currenty = y;
    for (int i = 0; i < 32; ++i){
        currenty = y + (1 << i);
        currenty = min(n, currenty);
        cout << "examine " << x << " " << currenty << endl;
        string s; cin >> s;
        t = s == "true";
        if (!t || currenty == n) break;
        ry = currenty;
    }
    if (currenty == n && t) ry = n;
    else{
        while (ry <= currenty){
            int m = (ry + currenty) / 2;
            cout << "examine " << x << " " << m << endl;
            string s; cin >> s;
            t = s == "true";
            if (t) ry = m + 1;
            else currenty = m - 1;
        }
        ry = currenty;
    }
    int ly = y; currenty = y;
    for (int i = 0; i < 32; ++i){
        currenty = y - (1 << i);
        currenty = max(1, currenty);
        cout << "examine " << x << " " << currenty << endl;
        string s; cin >> s;
        t = (s == "true");
        if (!t || currenty == 1) break;
        ly = currenty;
    }
    if (currenty == 1 && t) ly = 1;
    else{
        while (currenty <= ly){
            int m = (ly + currenty) / 2;
            cout << "examine " << x << " " << m << endl;
            string s; cin >> s;
            t = s == "true";
            if (t) ly = m - 1;
            else currenty = m + 1;
        }
        ++ly;
    }
    int lx = rx - (ry - ly);
    int m = (ry - ly + 1);
    int xm = (lx + rx) / 2;
    int ym = (ly + ry) / 2;
    rx = xm; ly = ry = ym;
    for (int i = 2; i >= 1; --i){
        if (ask1(xm, ym, 2 * m * i)){
            rx += 2 * m * i;
            break;
        }
    }
    for (int i = 2; i >= 1; --i){
        if (ask2(xm, ym, 2 * m * i)){
            ry += 2 * m * i;
            break;
        }
    }
    for (int i = 2; i >= 1; --i){
        if (ask2(xm, ym, - 2 * m * i)){
            ly -= 2 * m * i;
            break;
        }
    }
    lx = rx - (ry - ly);
    cout << "solution " << (lx + rx) / 2 << " " << (ly + ry) / 2 << endl;
}

int main(){
    if (fopen(taskname".txt", "r")){
        //freopen(taskname".txt", "r", stdin);
    }
    faster
    //freopen(taskname.inp, "r", stdin)
    //freopen(taskname.out, "w", stdout)
    Init();
}
#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...