Submission #1306603

#TimeUsernameProblemLanguageResultExecution timeMemory
1306603pvproColors (BOI20_colors)C++20
100 / 100
2 ms452 KiB
#ifndef LOCAL
#pragma GCC Optimize("O3,Ofast,unroll-loops")
#pragma GCC Target("bmi,bmi2,avx,avx2")
#endif
#include <bits/stdc++.h>

using namespace std;
using ll = long long;
using ld = long double;

#define int ll

#define f first 
#define s second 
#define mp make_pair 
#define pb push_back
#define pii pair<int, int>
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin() (x).rend()

mt19937 rnd(11);

int n, C;
int lst;

set<int> was;

int ask(int x) {
    assert(was.count(x) == 0);
    assert(x >= 0);
    assert(x < n);
    was.insert(x);
    cout << "? " << x + 1 << endl;
    int ans;
    #ifdef LOCAL
        ans = (abs(x - lst) >= C);
        lst = x;
    #else
        cin >> ans;
    #endif
    return ans;
}

void solve() {
    was.clear();
    cin >> n;
    int x = 0;
    int left = 0, right = 0;
    {
        int now = 0, d = 1;
        int l = 0, r = n;
        auto check = [&](int len) {
            now += d * len;
            d *= -1;
            if (now > 0) {
                right = max(right, now);
            } else {
                left = max(left, -now);
            }
            return false;
        };
        while (r - l > 1) {
            int m = (l + r) / 2;
            if (check(m)) {
                r = m;
            } else {
                l = m;
            }
        }
        assert(right + left <= n);
        x = left;
    }
    int now = x, d = 1;
    ask(now);
    int l = 0, r = n;
    auto check = [&](int len) {
        now += d * len;
        d *= -1;
        return ask(now);
    };
    while (r - l > 1) {
        int m = (l + r) / 2;
        if (check(m)) {
            r = m;
        } else {
            l = m;
        }
    }
    cout << "= " << r << endl;
}

signed main() {
    #ifdef LOCAL
        freopen("in.txt", "r", stdin);
        freopen("out.txt", "w", stdout);
    #else
        ios::sync_with_stdio(false);
        cin.tie(0);
    #endif
    int t = 1;
    // cin >> t;
    while (t--) {
        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...