제출 #1356449

#제출 시각아이디문제언어결과실행 시간메모리
1356449kantaponz비밀 (JOI14_secret)C++20
100 / 100
294 ms8140 KiB
#include "secret.h"
#include <bits/stdc++.h>
using namespace std;

const int nx = 1005;

int dp[nx][nx];
int n, a[nx];

void create_dp(int l, int r) {
    if (l == r) {
        dp[l][r] = a[l];
        return;
    }
    int mid = (l + r) >> 1;
    int val = 0;
    for (int i = mid; i >= l; i--) {
        if (i == mid) {
            val = a[mid];
            dp[i][mid] = val;
        } else {
            val = Secret(a[i], val);
            dp[i][mid] = val;
        }
    }
    for (int i = mid + 1; i <= r; i++) {
        if (i == mid + 1) {
            val = a[mid + 1];
            dp[mid + 1][i] = val;
        } else {
            val = Secret(val , a[i]);
            dp[mid + 1][i] = val;
        }
    }

    create_dp(l, mid);
    create_dp(mid + 1, r);

}

int solve(int l, int r, int x, int y) {
    if (l == r) return a[l];
    int mid = (l + r) >> 1;
    //printf("%d %d %d = %d\n", l, mid, r, dp[x][y]);
    if (y == mid) return dp[x][y];
    if (x == mid + 1) return dp[x][y];
    if (y <= mid) return solve(l, mid, x, y);
    if (x > mid) return solve(mid + 1, r, x, y);
    return Secret(dp[x][mid], dp[mid+1][y]);
}

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

int Query(int L, int R) {
    L++, R++;
    return solve(1, n, L, R);
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…