제출 #348832

#제출 시각아이디문제언어결과실행 시간메모리
348832spatarelSecret (JOI14_secret)C++17
100 / 100
521 ms4844 KiB
#include "secret.h" #include <map> struct StructQuery { int left; int right; }; bool operator < (const StructQuery &a, const StructQuery &b) { return (a.left < b.left) || (a.left == b.left && a.right < b.right); } int n; std::map<StructQuery, int> secrets; void querySecrets(int left, int right, int A[]) { if (left == right) { secrets[StructQuery{left, right}] = A[left]; } else { int avg = (left + right) / 2; secrets[StructQuery{avg, avg}] = A[avg]; for (int i = avg - 1; i >= left; i--) { secrets[StructQuery{i, avg}] = Secret(A[i], secrets[StructQuery{i + 1, avg}]); } secrets[StructQuery{avg + 1, avg + 1}] = A[avg + 1]; for (int i = avg + 2; i <= right; i++) { secrets[StructQuery{avg + 1, i}] = Secret(secrets[StructQuery{avg + 1, i - 1}], A[i]); } querySecrets(left, avg, A); querySecrets(avg + 1, right, A); } } void Init(int N, int A[]) { n = N; querySecrets(0, N - 1, A); } int Query(int L, int R) { int left = 0; int right = n - 1; while (true) { int avg = (left + right) / 2; if (R == avg || L == avg + 1) { return secrets[StructQuery{L, R}]; } else if (L <= avg && avg + 1 <= R) { return Secret(secrets[StructQuery{L, avg}], secrets[StructQuery{avg + 1, R}]); } else if (R < avg) { right = avg; } else { // avg + 1 < L left = avg + 1; } } return -1; }
#Verdict Execution timeMemoryGrader output
Fetching results...