Submission #1271748

#TimeUsernameProblemLanguageResultExecution timeMemory
1271748orzorzorzSecret (JOI14_secret)C++20
0 / 100
341 ms4476 KiB
#include "secret.h"
#include <bits/stdc++.h>
using namespace std;

const int MX = 1005;
int N;
int A[MX];
int leftVal[20][MX], rightVal[20][MX]; 
// 每層分治的跨越值

void build(int l, int r, int d) {
    if (l == r) return;
    int mid = (l + r) / 2;

    // 往左算
    leftVal[d][mid] = A[mid];
    for (int i = mid-1; i >= l; i--)
        leftVal[d][i] = Secret(A[i], leftVal[d][i+1]);

    // 往右算
    rightVal[d][mid+1] = A[mid+1];
    for (int i = mid+2; i <= r; i++)
        rightVal[d][i] = Secret(rightVal[d][i-1], A[i]);

    build(l, mid, d+1);
    build(mid+1, r, d+1);
}

void Init(int n, int a[]) {
    N = n;
    for (int i = 0; i < N; i++) A[i] = a[i];
    build(0, N-1, 0);
}

int query(int l, int r, int ql, int qr, int d) {
    if (ql <= l && r <= qr) {
        // fully inside
        return -1; // 不直接回,因為要判斷跨不跨
    }
    int mid = (l + r) / 2;
    if (qr <= mid) return query(l, mid, ql, qr, d+1);
    if (ql > mid) return query(mid+1, r, ql, qr, d+1);

    // 跨越區間
    return Secret(leftVal[d][ql], rightVal[d][qr]);
}

int Query(int L, int R) {
    return query(0, N-1, L, R, 0);
}
#Verdict Execution timeMemoryGrader output
Fetching results...