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...