Submission #1357609

#TimeUsernameProblemLanguageResultExecution timeMemory
1357609neptunnsDark Ride (EGOI25_darkride)C++20
54 / 100
0 ms516 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define int long long
#define maxn 500005
#define mi LLONG_MIN
#define ma LLONG_MAX
#define mod 1000000007
#define pb push_back
#define S second
#define F first
int ask(string s) {
    int ans;
    cout << "? " << s << endl;
    cin >> ans;
    return ans;
}
void answer(int a, int b) {
    cout << "! " << a << " " << b << endl;
    exit(0);
}
void solve() {
    int n, a = -1, b = -1;
    cin >> n;
    string s(n, '0');
    vector<pair<int, int>> hl;
    hl.pb({0, n - 1});
    while (true) {
        fill(s.begin(), s.end(), '0');
        for (auto [l, r] : hl) {
            int m = (l + r) / 2;
            for (int i = l; i <= m; i++) {
                s[i] = '1';
            }
        }

        if (ask(s) % 2) {
            break;
        }
        int sz = hl.size();
        for (int i = 0; i < sz; i++) {
            auto [l, r] = hl[i];
            int m = (l + r) / 2;
            hl[i] = {l, m};
            hl.pb({m + 1, r});
        }
    }
    vector<pair<int, int>> rng;
    for (auto [l, r] : hl) {
        int m = (l + r) / 2;
        rng.pb({l, m});
    }
    int l = 0, r = rng.size() - 1;
    while (r > l) {
        int m = (r + l) / 2;
        fill(s.begin(), s.end(), '0');
        for (int i = l; i <= m; i++) {
            auto [x, y] = rng[i];
            for (int r = x; r <= y; r++) {
                s[r] = '1';
            }
        }
        if (ask(s) % 2) {
            r = m;
        } else {
            l = m + 1;
        }
    }
    swap(l, rng[r].F);
    swap(r, rng[r].S);
    while (r > l) {
        int m = (r + l) / 2;
        fill(s.begin(), s.end(), '0');
        for (int i = l; i <= m; i++) {
            s[i] = '1';
        }
        if (ask(s) % 2) {
            r = m;
        } else {
            l = m + 1;
        }
    }
    a = r;
    l = 0, r = n - 1;
    while (r > l) {
        int m = (r + l) / 2;
        fill(s.begin(), s.end(), '0');
        for (int i = l; i <= m; i++) {
            s[i] = '1';
        }
        s[a] = '0';
        if (ask(s) % 2) {
            r = m;
        } else {
            l = m + 1;
        }
    }
    b = r;
    answer(a, b);
}

int32_t main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t = 1;
    // cin >> t;
    while (t--) solve();
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...