제출 #1154545

#제출 시각아이디문제언어결과실행 시간메모리
1154545hmm789Aliens (IOI07_aliens)C++20
100 / 100
1 ms432 KiB
#include "bits/stdc++.h"
using namespace std;
#define int long long
#define double long double
#define INF 1000000000000000000
#define MOD 1000000007

int n;

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

int32_t main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    int x0, y0, L, R, U, D;
    string s;
    cin >> n >> x0 >> y0;
    // solve in horizontal dim
    int l = 1, r = x0, m;
    while(l < r) {
        m = (l+r)/2;
        if(query(m, y0)) r = m;
        else l = m+1;
    }
    L = l;
    l = x0+1; r = n+1;
    while(l < r) {
        m = (l+r)/2;
        if(query(m, y0)) l = m+1;
        else r = m;
    }
    R = l-1;
//    cout << "L R " << L << " "  << R << endl;
    if(query((L+R)/2, y0)) {
        // check if (not) xoxox
        if(query( L-1+(R-L+1)*4/5, y0 )) { // x
            int L1 = L, R1 = R;
            if(query( L-1 + (R-L+1)*5, y0 )) R1 = L-1 + (R-L+1)*5;
            else if(query( L-1 + (R-L+1)*3, y0 )) R1 = L-1 + (R-L+1)*3;
            if(query( R+1 - (R-L+1)*5, y0 )) L1 = R+1 - (R-L+1)*5;
            else if(query( R+1 - (R-L+1)*3, y0 )) L1 = R+1 - (R-L+1)*3;
            L = L1; R = R1;
        }
    } else { // __xox__
        if(query( L-1+ (R-L+1)*5/3, y0 )) R = L-1+ (R-L+1)*5/3;
        else if(query( R+1 - (R-L+1)*5/3, y0 )) L = R+1 - (R-L+1)*5/3;
        else {
            int R1 = L-1 + (R-L+1)*4/3;
            int L1 = R+1 - (R-L+1)*4/3;
            L = L1; R = R1;
        }
    }
//    cout << "final L R " << L << " "<< R << endl;
    // solve in vertical dim
    l = 1; r = y0;
    while(l < r) {
        m = (l+r)/2;
        if(query(x0, m)) r = m;
        else l = m+1;
    }
    D = l;
    l = y0+1; r = n+1;
    while(l < r) {
        m = (l+r)/2;
        if(query(x0, m)) l = m+1;
        else r = m;
    }
    U = l-1;
//    cout << "D U " << D << " "  << U << endl;
    if(query(x0, (D+U)/2)) {
        // check if (not) xoxox
        if(query( x0, D-1+(U-D+1)*4/5 )) { // x
            int D1 = D, U1 = U;
            if(query( x0, D-1 + (U-D+1)*5 )) U1 = D-1 + (U-D+1)*5;
            else if(query( x0, D-1 + (U-D+1)*3 )) U1 = D-1 + (U-D+1)*3;
            if(query( x0, U+1 - (U-D+1)*5 )) D1 = U+1 - (U-D+1)*5;
            else if(query( x0, U+1 - (U-D+1)*3 )) D1 = U+1 - (U-D+1)*3;
            D = D1; U = U1;
        }
    } else { // __xox__
        if(query( x0, D-1+ (U-D+1)*5/3 )) U = D-1+ (U-D+1)*5/3;
        else if(query( x0, U+1 - (U-D+1)*5/3 )) D = U+1 - (U-D+1)*5/3;
        else {
            int U1 = D-1 + (U-D+1)*4/3;
            int D1 = U+1 - (U-D+1)*4/3;
            D = D1; U = U1;
        }
    }
//    cout << "final D U " << D << " "<< U << endl;
    cout << "solution " << (L+R)/2 << " " << (U+D)/2 << endl;
}
#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...