Submission #487190

#TimeUsernameProblemLanguageResultExecution timeMemory
487190VictorSecret (JOI14_secret)C++17
100 / 100
446 ms8260 KiB
#include "secret.h" #include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i = (a); i < (b); ++i) #define per(i, a, b) for (int i = (b - 1); i >= (a); --i) #define trav(a, x) for (auto &a : x) #define all(x) x.begin(), x.end() #define sz(x) x.size() #define pb push_back #define debug(x) cout << #x << " = " << x << endl #define umap unordered_map #define uset unordered_set typedef pair<int, int> ii; typedef pair<int, ii> iii; typedef vector<int> vi; typedef vector<ii> vii; typedef vector<vi> vvi; typedef long long ll; typedef pair<ll, ll> pll; typedef vector<ll> vll; typedef vector<pll> vpll; const int INF = 1'000'000'007; int prefix[1001][1001], nums[1001]; int n; void populate(int L, int R) { int mid = (L + R) / 2; prefix[mid][mid] = nums[mid]; prefix[mid + 1][mid + 1] = nums[mid + 1]; for (int i = mid + 2; i <= R; i++) prefix[mid + 1][i] = Secret(prefix[mid + 1][i - 1], nums[i]); for (int i = mid - 1; i >= L; i--) prefix[mid][i] = Secret(nums[i], prefix[mid][i + 1]); if (L < mid) populate(L, mid); if (mid + 1 < R) populate(mid + 1, R); } void Init(int N, int A[]) { memset(prefix, -1, sizeof(prefix)); rep(i, 0, N) nums[i] = A[i]; populate(0, N - 1); n = N; } int Query(int L, int R) { if (L == R) return nums[L]; int lo = 0, hi = n - 1; while (1) { int mid = (lo + hi) / 2; if (L <= mid && mid < R) return Secret(prefix[mid][L], prefix[mid + 1][R]); if (R == mid) return prefix[mid][L]; if (mid < L) lo = mid + 1; else hi = mid; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...