답안 #289310

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
289310 2020-09-02T14:30:47 Z zecookiez Aliens (IOI07_aliens) C++17
100 / 100
2 ms 396 KB
#include <bits/stdc++.h>
using namespace std;
template<class C>constexpr int len(const C&c){return int(c.size());}

const int DDX[13] = {-2, 0, 2, -1, 1, -2, 0, 2, -1, 1, -2, 0, 2};
const int DDY[13] = {-2, -2, -2, -1, -1, 0, 0, 0, 1, 1, 2, 2, 2};
long long N;

bool rng(long long X){
    return 1 <= X && X <= N;
}

map<pair<long long, long long>, bool> memo;
bool query(long long X, long long Y){
    if(!rng(X) || !rng(Y)) return false;
    if(memo.count(make_pair(X, Y))) return memo[make_pair(X, Y)];
    assert(memo.size() < 300);
    cout << "examine " << X << " " << Y << endl;
    string s; cin >> s;
    return memo[make_pair(X, Y)] = (s == "true");
}

int main(){
    cin.sync_with_stdio(0); cin.tie(0); cout.tie(0);
    long long XS, YS, X1, Y1, X2, SZ, XC, YC; cin >> N >> XS >> YS;
    // find offset from center of current square
    X1 = XS; Y1 = YS;
    while(true){
        long long i = 1;
        for(;;i+=i){
            if(!query(X1 + i, Y1)){
                X1 += i / 2LL; break;
            }
        }
        long long L = X1, R = X1 + i / 2LL, MID;
        while(R - L > 1){
            MID = L + (R - L) / 2;
            if(query(MID, Y1)) L = MID;
            else R = MID;
        }
        X1 = L; break;
    }
    X2 = XS;
    while(true){
        long long i = 1;
        for(;; i += i){
            if(!query(X2 - i, Y1)){
                X2 -= i / 2LL; break;
            }
        }
        long long L = X2 - i / 2LL, R = X2, MID;
        while(R - L > 1){
            MID = L + (R - L) / 2;
            if(query(MID, Y1)) R = MID;
            else L = MID;
        }
        X2 = R; break;
    }
    // stupid
    SZ = X1 - X2 + 1; XC = (X1 + X2) / 2;
    while(true){
        long long i = 1;
        for(;; i += i){
            if(!query(XC, Y1 - i)){
                Y1 -= i / 2LL; break;
            }
        }
        long long L = Y1 - i / 2LL, R = Y1, MID;
        while(R - L > 1){
            MID = L + (R - L) / 2;
            if(query(XC, MID)) R = MID;
            else L = MID;
        }
        Y1 = R; break;
    }
    YC = Y1 + SZ / 2;
    // +41 queries
    for(int i = 0; i < 13; ++i){
        X1 = XC + SZ * DDX[i];
        Y1 = YC + SZ * DDY[i];
        if(!rng(X1) || !rng(Y1)) continue;
        int cnt = 0;
        for(int j = 0; j < 13; ++j){
            XS = X1 + SZ * DDX[j];
            YS = Y1 + SZ * DDY[j];
            if(rng(XS) && rng(YS) && query(XS, YS)) ++cnt;
            else break;
        }
        if(cnt == 13){
            cout << "solution " << X1 << " " << Y1 << endl;
            memo.clear();
            return 0;
        }
    }
    memo.clear();
    assert(false);
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 2 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 1 ms 392 KB Output is correct
3 Correct 1 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 396 KB Output is correct
2 Correct 1 ms 388 KB Output is correct
3 Correct 1 ms 392 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 384 KB Output is correct
2 Correct 2 ms 384 KB Output is correct
3 Correct 1 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
3 Correct 2 ms 384 KB Output is correct