Submission #954532

#TimeUsernameProblemLanguageResultExecution timeMemory
954532IBorySecret (JOI14_secret)C++17
100 / 100
398 ms5148 KiB
#include "secret.h" #include <bits/stdc++.h> #define pii pair<int, int> using namespace std; const int MAX = 1004; map<pii, int> D; int N, S[MAX]; void DnC1(int L, int R) { if (L >= R) return; int mid = (L + R) >> 1; int pv = -1; for (int i = mid - 1; i >= L; --i) { int n = -1; if (pv == -1) n = Secret(S[i], S[mid]); else n = Secret(S[i], pv); pv = D[{i, mid}] = n; } pv = -1; for (int i = mid + 2; i <= R; ++i) { int n = -1; if (pv == -1) n = Secret(S[mid + 1], S[i]); else n = Secret(pv, S[i]); pv = D[{mid + 1, i}] = n; } DnC1(L, mid); DnC1(mid + 1, R); } void Init(int _N, int A[]) { N = _N; for (int i = 0; i < N; ++i) S[i] = A[i]; DnC1(0, N - 1); for (int i = 0; i < N; ++i) D[{i, i}] = A[i]; } int DnC2(int L, int R, int s, int e) { if (L >= R) return -1; int mid = (L + R) >> 1; if (s <= mid && mid < e) { int a = D[{s, mid}], b = D[{mid + 1, e}]; return Secret(a, b); } if (e <= mid) return DnC2(L, mid, s, e); else return DnC2(mid + 1, R, s, e); } int Query(int L, int R) { if (D.find(pii{L, R}) != D.end()) return D[{L, R}]; return DnC2(0, N - 1, L, R); }
#Verdict Execution timeMemoryGrader output
Fetching results...