|
1 | 1 | #include<bits/stdc++.h>
|
2 | 2 | using namespace std;
|
3 | 3 |
|
4 |
| -const int MAXN = 3*1e5 + 10; |
5 |
| -const int MAXP = log2(MAXN) + 10; |
6 |
| -int min_table[MAXP][MAXN]; |
7 |
| -int a[MAXN]; |
8 |
| -int numlog[MAXN]; |
9 |
| -int n; |
| 4 | +struct RMQ { |
| 5 | + int n; |
| 6 | + vector<int> numlog; |
| 7 | + vector<vector<int>> min_table; |
| 8 | + RMQ(vector<int>& vals):n(vals.size()) { |
| 9 | + numlog = vector<int>(n+1); |
| 10 | + numlog[1] = 0; |
| 11 | + for(int i=2;i<=n;i++) numlog[i] = numlog[i/2] + 1; |
10 | 12 |
|
11 |
| - |
12 |
| -void init() { |
13 |
| - numlog[1] = 0; |
14 |
| - for(int i=2;i<=n;i++) numlog[i] = numlog[i/2] + 1; |
15 |
| - |
16 |
| - for(int i=0;i<=numlog[n];i++) { |
17 |
| - int skiprange = 1<<i; |
18 |
| - for(int j=0;j+skiprange<=n;j++) { |
19 |
| - if(i==0) { |
20 |
| - min_table[i][j] = a[j]; |
21 |
| - continue; |
| 13 | + min_table = vector<vector<int>>(numlog[n]+1, vector<int>(n+1)); |
| 14 | + for(int i=0;i<=numlog[n];i++) { |
| 15 | + int skiprange = 1<<i; |
| 16 | + for(int j=0;j+skiprange<=n;j++) { |
| 17 | + if(i==0) { |
| 18 | + min_table[i][j] = vals[j]; |
| 19 | + continue; |
| 20 | + } |
| 21 | + min_table[i][j] = operate(min_table[i-1][j], min_table[i-1][j+(skiprange>>1)]); |
22 | 22 | }
|
23 |
| - min_table[i][j] = min(min_table[i-1][j], min_table[i-1][j+(skiprange>>1)]); |
24 | 23 | }
|
25 | 24 | }
|
26 |
| -} |
27 | 25 |
|
28 |
| -int query(int low, int high) { |
29 |
| - int range = high-low+1; |
30 |
| - int p = numlog[range]; |
31 |
| - int mn = min(min_table[p][low], min_table[p][high-(1<<p)+1]); |
32 |
| - return mn; |
33 |
| -} |
| 26 | + int query(int low, int high) { |
| 27 | + int range = high-low+1; |
| 28 | + int p = numlog[range]; |
| 29 | + int mn = operate(min_table[p][low], min_table[p][high-(1<<p)+1]); |
| 30 | + return mn; |
| 31 | + } |
| 32 | + |
| 33 | + int operate(int a, int b) { |
| 34 | + return min(a, b); |
| 35 | + } |
| 36 | +}; |
34 | 37 |
|
35 | 38 |
|
36 | 39 | int main() {
|
37 | 40 | vector<int> tmp = {4,3,2,1};
|
38 |
| - n = tmp.size(); |
39 |
| - copy(tmp.begin(), tmp.end(), a); |
40 |
| - init(); |
41 |
| - cout << query(0, 3) << "\n"; // 1 |
42 |
| - cout << query(0, 1) << "\n"; // 3 |
43 |
| - cout << query(1, 2) << "\n"; // 2 |
| 41 | + RMQ rmq(tmp); |
| 42 | + cout << rmq.query(0, 3) << "\n"; // 1 |
| 43 | + cout << rmq.query(0, 1) << "\n"; // 3 |
| 44 | + cout << rmq.query(1, 2) << "\n"; // 2 |
44 | 45 | }
|
0 commit comments