제출 #1359702

#제출 시각아이디문제언어결과실행 시간메모리
1359702nagorn_phAliens (IOI07_aliens)C++20
0 / 100
0 ms420 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace std;
using namespace __gnu_pbds;

#define ordered_set <int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update>
#define ordered_multiset <int, null_type, less_equal <int>, rb_tree_tag, tree_order_statistics_node_update>

#define int long long
#define double long double
#define pii pair <int, int>
#define tiii tuple <int, int, int>
#define tiiii tuple <int, int, int, int>
#define emb emplace_back
#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()
#define iShowSpeed cin.tie(NULL)->sync_with_stdio(false)
#define matrix vector <vector <int>>
#define mat(n, m) vector <vector <int>> (n, vector <int> (m));

const int mod = 1e9 + 7;
const int inf = 1e18;
const matrix II = {{1, 0}, {0, 1}};
const int N = 2e5 + 5;

bool ok(string &s){
    return s[0] == 't';
}

bool query(int x, int y){
    cout << "examine " << x << " " << y << endl;
    string s; cin >> s;
    return ok(s);
}

void solve(){
    int n, x, y; cin >> n >> x >> y;
    int dist = 0, mn = inf;
    int l = 0, r = n;
// lefttttttttttttttttttttttttttttttttttttttttttttttttttttttt
    dist = x - 1, mn = inf;
    while (dist > 0) {
        if (!query(x - dist, y)) mn = min(mn, dist);
        dist /= 2;
    }
    l = x - mn, r = x;
    while (l < r) {
        int mid = (l + r) / 2;
        if (query(mid, y)) r = mid;
        else l = mid + 1;
    }
    int left = l;
// rightttttttttttttttttttttttttttttttttttttttttttttttttttttt
    dist = n - x, mn = inf;
    while (dist > 0) {
        if (!query(x + dist, y)) mn = min(mn, dist);
        dist /= 2;
    }
    l = x, r = x + mn;
    while (l < r) {
        int mid = (l + r + 1) / 2;
        if (query(mid, y)) l = mid;
        else r = mid - 1;
    }
    int right = l;
    int len = right - left + 1;
    // cout << "LR : " << left << ", " << right << "\n";
// find y axis
    l = 0, r = min(len - 1, y - 1);
    while (l < r) {
        int mid = (l + r + 1) / 2;
        if (query(x, y - mid)) l = mid;
        else r = mid - 1;
    }
    int up = y - l;
    l = 0, r = min(len - 1, n - y);
    while (l < r) {
        int mid = (l + r + 1) / 2;
        if (query(x, y + mid)) l = mid;
        else r = mid - 1;
    }
    int down = y + l;
    // cout << "UD : " << up << ", " << down << "\n";
// idk some other shi
    int cx = (left + right) / 2;
    int cy = (up + down) / 2;
    len = min(right - left + 1, cx - 1);
    while (1) {
        if (query(cx - len, cy)) cx -= len;
        else break;
    }
    len = min(right - left + 1, cy - 1);
    while (1) {
        if (query(cx, cy - len)) cy -= len;
        else break;
    }
    cout << "solution " << cx + 2 * len << " " << cy + 2 * len << endl;
}

int32_t main(){
    // iShowSpeed;
    // int q; cin >> q; while (q--) 
    solve();
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…