답안 #960835

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
960835 2024-04-11T06:03:39 Z Pring Mađioničar (COI22_madionicar) C++17
0 / 100
834 ms 11188 KB
#include <bits/stdc++.h>
using namespace std;

#ifdef MIKU
string dbmc = "\033[1;38;2;57;197;187m", dbrs = "\033[0m";
#define debug(x...) cout << dbmc << "[" << #x << "]: ", dout(x)
void dout() { cout << dbrs << endl; }
template <typename T, typename ...U>
void dout(T t, U ...u) { cout << t << (sizeof...(u) ? ", " : ""); dout(u...); }
#else
#define debug(...) 39
#endif

#define fs first
#define sc second
#define mp make_pair
#define FOR(i, j, k) for (int i = j, Z = k; i < Z; i++)
using ll = long long;
typedef pair<int, int> pii;

const int MXN = 200005;
int n;
int N;
map<pii, int> M;

int fquery(int l, int r) {
    cout << "? " << l << ' ' << r << endl;
    int x;
    cin >> x;
    return x;
}

int query(int l, int r) {
    // [l, r]
    auto fquery = [&](int l, int r) -> int {
        if (l == r) return 1;
        cout << "? " << l << ' ' << r << endl;
        int x;
        cin >> x;
        return x;
    };
    if (l <= 0 || r > N) return 0;
    if (l & 1) l++;
    if (r & 1) r--;
    l /= 2;
    r /= 2;
    auto it = M.find(mp(l, r));
    return (it == M.end() ? (M[mp(l, r)] = fquery(l, r)) : it -> sc);
}

namespace MANACHER {
    int m[MXN], l;

    void DO() {
        m[1] = 0;
        m[2] = 1;
        l = 2;
        FOR(i, 3, N + 1) {
            if (i >= l + m[l] + 1) {
                while (true) {
                    if (query(i - m[i] - 1, i + m[i] + 1) == 0) break;
                    m[i]++;
                }
                l = i;
            } else {
                int i_ = 2 * l - i;
                if (i_ - m[i_] == l - m[l]) {
                    m[i] = m[i_];
                    while (true) {
                        if (query(i - m[i] - 1, i + m[i] + 1) == 0) break;
                        m[i]++;
                    }
                    l = i;
                } else if (i_ - m[i_] < l - m[l]) {
                    m[i] = i_ + m[l] - l;
                } else {
                    m[i] = m[i_];
                }
            }
        }
    }
}

void miku() {
    cin >> n;
    N = 2 * n + 1;
    MANACHER::DO();
    // int ans = 0;
    // FOR(1, N + 1) {
    //     if (i & 1) 
    // }
    cout << *max_element(MANACHER::m + 1, MANACHER::m + N + 1) << '\n';
}

int32_t main() {
    cin.tie(0) -> sync_with_stdio(false);
    cin.exceptions(cin.failbit);
    miku();
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 64 ms 1744 KB invalid token
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 64 ms 1744 KB invalid token
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 834 ms 11188 KB invalid token
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 64 ms 1744 KB invalid token
2 Halted 0 ms 0 KB -