제출 #1274180

#제출 시각아이디문제언어결과실행 시간메모리
1274180ezrapoMađioničar (COI22_madionicar)C++20
0 / 100
493 ms1996 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
int32_t main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    int n; cin >> n;
    auto query=[&](int l, int r) {
        cout << "? " << l << " " << r << endl;
        cout.flush();
        int res; cin >> res;
        return res==1;
    };
    auto ans=[&](int answer) {
        cout << "! " << answer << endl;
        cout.flush();
        exit(0);
    };
    vector<int> c1(n+1, 0), c2(n+1, 0);
    {
        int l=1, r=0;
        for (int i=1; i<=n; i++) {
            int k=1;
            if (i<=r) k=min(c1[l+r-i], r-i+1);
            while (i-k>=1 && i+k<=n) {
                if (!query(i-k, i+k)) break;
                k++;
            }
            c1[i]=k;
            if (i+k-1>r) {
                l=i-k+1;
                r=i+k-1;
            }
        }
    }
    {
        int l=1, r=0;
        for (int i=1; i<=n; i++) {
            int k=0;
            if (i<=r) k=min(c2[l+r-i+1], r-i+1);
            while (i-k>=1 && i+k+1<=n) {
                if (!query(i-k, i+k+1)) break;
                k++;
            }
            c2[i]=k;
            if (i+k>r) {
                l=i-k+1;
                r=i+k;
            }
        }
    }
    int best=0;
    for (int i=1; i<=n; i++) {
        best=max(best, c1[i]*2-1);
        best=max(best, c2[i]*2);
    }
    ans(best);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...