제출 #1315536

#제출 시각아이디문제언어결과실행 시간메모리
1315536buzdi비밀 (JOI14_secret)C++17
100 / 100
344 ms4416 KiB
#include "secret.h" const int NMAX = 1000; const int LOGMAX = 9; int a[NMAX + 1], n; int st[LOGMAX + 1][NMAX + 1]; int mask[NMAX + 1]; void precalc(int left, int right, int k) { if(left == right) { return; } int mid = (left + right) / 2; st[k][mid] = a[mid]; for(int i = mid - 1; i >= left; i--) { st[k][i] = Secret(a[i], st[k][i + 1]); } st[k][mid + 1] = a[mid + 1]; for(int i = mid + 2; i <= right; i++) { st[k][i] = Secret(st[k][i - 1], a[i]); } for(int i = mid + 1; i <= right; i++) { mask[i] |= (1 << k); } precalc(left, mid, k + 1); precalc(mid + 1, right, k + 1); } void Init(int N, int A[]) { for(int i = 1; i <= N; i++) { a[i] = A[i - 1]; } n = N; precalc(1, n, 0); } int Query(int L, int R) { L++; R++; if(L == R) { return a[L]; } int k = __builtin_ctz(mask[L] ^ mask[R]); return Secret(st[k][L], st[k][R]); }
#Verdict Execution timeMemoryGrader output
Fetching results...