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 }

浙公网安备 33010602011771号