Submission #1303936

#TimeUsernameProblemLanguageResultExecution timeMemory
1303936maxiedSecret (JOI14_secret)C++20
100 / 100
344 ms4444 KiB
#include "secret.h" #include <bits/stdc++.h> using namespace std; //int Secret(int X, int Y); vector<int> v; template <typename T, typename F> class DisjointSparseTable { public: int n; vector<vector<T>> mat; F func; DisjointSparseTable(const vector<T>& a, const F& f) : n(int(a.size())), func(f) { mat.push_back(a); for (int p = 1; (1 << p) < n; p++) { mat.emplace_back(n); for (int mid = 1 << p; mid < n; mid += 1 << (p + 1)) { mat[p][mid - 1] = a[mid - 1]; for (int j = mid - 2; j >= mid - (1 << p); j--) { mat[p][j] = func(a[j], mat[p][j + 1]); } mat[p][mid] = a[mid]; for (int j = mid + 1; j < min(n, mid + (1 << p)); j++) { mat[p][j] = func(mat[p][j - 1], a[j]); } } } } T Query(int l, int r) const { assert(0 <= l && l < r && r <= n); if (r - l == 1) { return mat[0][l]; } int p = bit_width(unsigned(l ^ (r - 1))) - 1; return func(mat[p][l], mat[p][r - 1]); } }; DisjointSparseTable<int,function<int(int,int)>> *table = nullptr; void Init(int n, int a[]) { v.assign(n, 0); for (int i = 0; i < n; i++){ v[i] = a[i]; } table = new DisjointSparseTable(v, (function<int(int,int)>)[&](int a, int b) -> int{return Secret(a, b);}); } int Query(int l, int r) { return table->Query(l, r + 1); }
#Verdict Execution timeMemoryGrader output
Fetching results...