제출 #1330867

#제출 시각아이디문제언어결과실행 시간메모리
1330867miminyteWorm Worries (BOI18_worm)C++20
0 / 100
370 ms4164 KiB
#include <iostream>
#include <vector>
#include <map>

using namespace std;

vector <int> v;
int q;
int l, r, mid;

int gr_left(int a, int b) {
    return int(0.382 * (b - a)) + a;
}

int gr_right(int a, int b) {
    return int(0.618 * (b - a)) + a;
}

int ask(int i) {
    if(q == 0) {
        cout << r-mid << ' ' << mid-l << endl;
        exit(0);
    }
    q--;

    cout << "? " << i+1 << " 1 1" << endl;
    cin >> v[i];
    return v[i];
}

int main() {
    int n, m, k;

    cin >> n >> m >> k >> q;

    v.resize(n, -1);

    l = 0;
    r = n - 1;

    int a, b;
    a = gr_left(0, n);
    b = gr_right(0, n);
    if(a == b) {
        b++;
    }

    ask(a);
    ask(b);

    bool next_right = false;

    if(v[a] < v[b]) {
        l = a;
        mid = b;
        next_right = true;
    } else {
        r = b;
        mid = a;
    }

    int curr;

    while(r - mid > 1 || mid - l > 1) {
        if(next_right) {
            curr = gr_right(l, r);
            ask(curr);
            if(v[curr] > v[mid]) {
                l = mid;
                mid = curr;
                next_right = true;
            } else {
                r = curr;
                next_right = false;
            }
        } else {
            curr = gr_left(l, mid);
            ask(curr);
            if(v[curr] > v[mid]) {
                r = mid;
                mid = curr;
                next_right = false;
            } else {
                l = curr;
                next_right = true;
            }
        }
        // if(r - mid > mid - l) {
        //     curr = (mid + r) / 2;
        //     ask(curr);
        //     if(v[curr] < v[mid]) {
        //         r = curr;
        //     } else {
        //         l = mid;
        //         mid = curr;
        //     }
        // }
        // else {
        //     curr = (mid + l) / 2;
        //     ask(curr);
        //     if(v[curr] < v[mid]) {
        //         l = curr;
        //     } else {
        //         r = mid;
        //         mid = curr;
        //     }
        // }
    }

    if(mid > 0 && v[mid-1] == -1) {
        ask(mid-1);
    }

    if(mid < n-1 && v[mid+1] == -1) {
        ask(mid+1);
    }

    if(v[mid] >= v[mid-1] && v[mid] >= v[mid+1]) {
        cout << "! " << mid + 1 << " 1 1" << endl;
    } else if(v[mid-1] >= v[mid]) {
        cout << "! " << mid - 1 + 1 << " 1 1" << endl;
    } else {
        cout << "! " << mid + 1 + 1 << " 1 1" << endl;
    }

    return 0;
}
#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...