Loading

ST表板子(粗略)

ST表的功能很简单

它是解决RMQ问题(区间最值问题)的一种强有力的工具

它可以做到O(nlogn)预处理和O(1)查询最值

预处理:

首先预处理出lg数组(或者使用内置函数__lg()),预处理f数组....

查询:

 

 

代码:

 

 

 1 #include <bits/stdc++.h>
 2 #define gogo ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
 3 using namespace std;
 4 //using i64 = long long;
 5 const string YES = "Yes";
 6 const string NO = "No";
 7 
 8 inline int read() {
 9     int x=0,f=1;char ch=getchar();
10     while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
11     while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
12     return x*f;
13 }
14 const int N = 100010;
15 int f[N][21], lg[N];
16 int32_t main() { 
17     //gogo;
18     int n, q;
19     cin >> n >> q;
20     for (int i = 1;i <= n;i ++) 
21         //f[i][0] = read();
22         cin >> f[i][0];
23     lg[1] = 0;
24     for (int i = 2;i <= n;i ++)
25         lg[i] = lg[i >> 1] + 1;
26     for (int j = 1;j <= lg[n];j ++) 
27         for (int i = 1;i <= n - (1 << (j - 1)) + 1;i ++ )
28             f[i][j] = max(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);
29 
30     while (q --) {
31         int l, r;
32         //l = read(), r = read();
33         cin >> l >> r;
34         int k = lg[r - l + 1];
35         cout << max(f[l][k], f[r - (1 << k) + 1][k]) << '\n';
36     }
37 }

 

posted @ 2023-02-10 21:16  KakaDBL  阅读(38)  评论(0)    收藏  举报