Submission #678884

# Submission time Handle Problem Language Result Execution time Memory
678884 2023-01-06T20:28:25 Z Hacv16 Aliens (IOI07_aliens) C++17
20 / 100
5 ms 464 KB
#include<bits/stdc++.h>
using namespace std;

const int MAX = 1e6 + 15;

int n, x, y, m, numblock, numq;

bool query(int x, int y){
    assert(++numq <= 300);

    cout << "examine " << x << ' ' << y << '\n'; cout.flush();
    string ans; cin >> ans; return (ans == "true");
}

bool check(int x){ return x > 0 && x < n ;}

int main(){
    cin >> n >> x >> y;

    int up = y, down = y;

    while(check(up + 1) && query(x, up + 1)) up++;
    while(check(down - 1) && query(x, down - 1)) down--;

    m = up - down + 1;
    while(x - 1 > 0 && query(x - 1, up)) x--;

    int l = 0, r = 3 * n / m, curx = x, cury = up, jump = 0;

    //Pula diagonal
    while(l <= r){
        int mid = (l + r) >> 1;
        int nx = curx + m * mid, ny = cury + m * mid;
        if(!check(nx) || !check(ny)){ r = mid - 1; continue; }
        if(query(nx, ny)) l = mid + 1, jump = mid;
        else r = mid - 1;
    }   

    curx += jump * m;
    cury += jump * m;

    //cerr << curx << ' ' << cury << '\n';

    l = 0, r = ((n + m - 1)/ m), jump = 0;

    //Pula cima
    while(l <= r){
        int mid = (l + r) >> 1;
        int ny = cury + m * (2 * mid);
        if(!check(ny)) { r = mid - 1; continue; }
        if(query(curx, ny)) l = mid + 1, jump = 2 * mid;
        else r = mid - 1;
    }

    cury += jump * m;

    //Pula esquerda
    l = 0, r = ((n + m - 1)/ m), jump = 0;

    while(l <= r){
        int mid = (l + r) >> 1;
        int nx = curx - m * (2 * mid);
        if(!check(nx)){ r = mid - 1; continue; }
        if(query(nx, cury)) l = mid + 1, jump = 2 * mid;
        else r = mid - 1;
    }

    curx -= jump * m;
    
    //move to center of current block
    curx += (m - 1) / 2;
    cury -= (m - 1) / 2;
    
    //move to center block
    l = 0, r = ((n + m - 1) / m), jump = 0;

    while(l <= r){
        int mid = (l + r) >> 1;
        int nx = curx + m * (2 * mid);
        if(!check(nx)){ r = mid - 1; continue; }
        if(query(nx, cury)) l = mid + 1, jump = 2 * mid;
        else r = mid - 1;
    }

    numblock = jump + 1;

    curx += ((numblock - 1) / 2) * m;
    cury -= ((numblock - 1) / 2) * m;
    
    cout << "solution " << curx << ' ' << cury << '\n';
    cout.flush();
    
    return 0;
}
# Verdict Execution time Memory Grader output
1 Correct 1 ms 208 KB Output is correct
2 Correct 0 ms 208 KB Output is correct
# Verdict Execution time Memory Grader output
1 Incorrect 1 ms 208 KB Incorrect
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 2 ms 208 KB Incorrect
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 208 KB Output is correct
2 Correct 2 ms 208 KB Output is correct
# Verdict Execution time Memory Grader output
1 Runtime error 3 ms 464 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 208 KB Output is correct
2 Runtime error 2 ms 428 KB Execution killed with signal 6
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 208 KB Output is correct
2 Runtime error 2 ms 432 KB Execution killed with signal 6
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Runtime error 2 ms 428 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Runtime error 4 ms 424 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Runtime error 5 ms 464 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -