Submission #1176548

#TimeUsernameProblemLanguageResultExecution timeMemory
1176548qrnAliens (IOI07_aliens)C++20
0 / 100
0 ms432 KiB
#include <bits/stdc++.h>
using namespace std;

#define SPEED                     \
    ios_base::sync_with_stdio(0); \
    cin.tie(NULL);                \
    cout.tie(NULL);

#define pb push_back
#define ins insert
#define fi first
#define se second

// #define endl "\n"
#define ALL(x) x.begin(), x.end()
#define sz(x) x.size()
#define intt long long

const intt mod = 1e9 + 7;
const intt base = 31;
const intt inf = 1e18;
const intt mxN = 1e6 + 5;
const intt L = 21;

bool interaction(intt x, intt y) {
    cout << "examine " << x << " " << y << endl;
    bool s;
    cin >> s;
    return s;
}
intt N, M;

bool isorta(intt x, intt y) {
    if( x - 1 >= 1 && y - 1 >= 1 && interaction(x - 1, y - 1) && 
        x - 1 >= 1 && y + 1 <= N && interaction(x - 1, y + 1) && 
        x + 1 <= N && y - 1 >= 1 && interaction(x + 1, y - 1)){
            if(x - 2 * M >= 1 && interaction(x - 2 * M, y) && x + 2 * M <= N && interaction(x+2*M, y)) {
                return false;
            }
            return true;
        }
        return false;
}

void solve() {
    intt x, y;
    cin >> N >> x >> y;
    
    intt sob = y, yb = x, sab = y, ab = x;
    
    // sol terefe
    for(intt k = 0; ; k++) {
        if(y - (1 << k) <= 0) {
            sob = 1;
            break;
        }
        if(interaction(x, y - (1 << k)) == false) {
            sob -= (1 << k);
            break;
        }
    }
    
    // yuxari terefe
    for(intt k = 0; ; k++) {
        if(x - (1 << k) <= 0) {
            yb = 1;
            break;
        }
        if(interaction(x - (1 << k), y) == false) {
            yb -= (1 << k);
            break;
        }
    }
    
    // sag terefe
    for(intt k = 0; ; k++) {
        if(y + (1 << k) > N) {
            sab = N;
            break;
        }
        if(interaction(x, y + (1 << k)) == false) {
            sab += (1 << k);
            break;
        }
    }
    
    // asagi terefe
    for(intt k = 0; ; k++) {
        if(x + (1 << k) > N) {
            ab = N;
            break;
        }
        if(interaction(x + (1 << k), y) == false) {
            ab += (1 << k);
            break;
        }
    }
    
    intt bso = 0, bsa = 0, ba = 0, by = 0;
    
    // solda
    intt l = sob, r = y;
    while(l <= r) {
        intt mid = (l + r) / 2;
        if(interaction(x, mid)) {
            bso = mid;
            r = mid - 1;
        } else {
            l = mid + 1;
        }
    }
    
    // sagda
    l = y, r = sab;
    while(l <= r) {
        intt mid = (l + r) / 2;
        if(interaction(x, mid)) {
            bsa = mid;
            l = mid + 1;
        } else {
            r = mid - 1;
        }
    }
    
    // yuxarda
    l = yb, r = x;
    while(l <= r) {
        intt mid = (l + r) / 2;
        if(interaction(mid, y)) {
            by = mid;
            r = mid - 1;
        } else {
            l = mid + 1;
        }
    }
    
    //asagda
    l = x, r = ab;
    while(l <= r) {
        intt mid = (l + r) / 2;
        if(interaction(mid, y)) {
            ba = mid;
            l = mid + 1;
        } else {
            r = mid - 1;
        }
    }
    M = ba - by + 1;
    intt acty = 0, actso = 0, actsa = 0, acta = 0;
    
    pair<intt,intt> ul = {by, bso};
    pair<intt,intt> dr = {ba, bsa};
    
    if(isorta(ul.fi, ul.se)) {
        dr.fi = ul.fi - 1;
        dr.se = ul.se - 1;
        ul.fi = ul.fi - M;
        ul.se = ul.se - M;
    }
    
    if(ul.fi - M * 4 >= 1 && interaction(ul.fi - 4 * M, y)){
        acty = ul.fi - M * 4;
    } else if(ul.fi - M * 2 >= 1 && interaction(ul.fi - 2 * M, y)) {
        acty = ul.fi - M * 2;
    } else {
        acty = ul.fi;
    }
    
    if(ul.se - M * 4 >= 1 && interaction(x, ul.se - M * 4)) {
        actso = ul.se - M * 4;
    } else if(ul.se - M * 2 >= 1 && interaction(x, ul.se - M * 2)) {
        actso = ul.se - M * 2;
    } else {
        actso = ul.se;
    }
    
    if(ul.fi + M * 4 <= N && interaction(ul.fi + 4 * M, y)){
        acta = ul.fi +  M * 4;
    } else if(ul.fi + M * 2 <= N && interaction(ul.fi + 2 * M, y)) {
        acta = ul.fi + M * 2;
    } else {
        acta = ul.fi;
    }
    
    if(ul.se + M * 4 <= N && interaction(x, ul.se + M * 4)) {
        actsa = ul.se + M * 4;
    } else if(ul.se + M * 2 <= N && interaction(x, ul.se + M * 2)) {
        actsa = ul.se + M * 2;
    } else {
        actsa = ul.se;
    }
    
    cout << "solution " << (acty + acta) / 2 + 1 << " " << (actso + actsa) / 2 + 1 << endl;
}

signed main() {
    SPEED;
    intt tst = 1;
    // cin >> tst;
    while (tst--) {
        solve();
    }
}
#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...