标签:直接 ++ 预处理 左右 char through ini st表 max
ST表是一种用于处理静态RMQ问题(无修改区间最值问题)的最快数据结构,书写方便使用简单效率便捷。其中其预处理复杂度为O(nlogn),查询复杂度为O(1)。总时间复杂度为O(nlogn)。常数远小于树状数组、线段树等毒瘤数据结构。
ST表在预处理时采用倍增以及DP思想,即设f[i][j]为i向右2j-1个坐标的最大值。在DP时以j为阶段进行转移。
在查询时,由于2的(被查询区间长度的对数的两倍)个单位(即22*log(len))一定大于区间长度,所以可以查询左右端点向中间2log(len)-1个单位的最大值,取max即为答案。
由于ST表极为简单,在这里直接给出代码。
#include<cmath> #include<cstdio> #define maxn 100010 inline void qr(int &x) { char ch=getchar();int f=1; while(ch>‘9‘||ch<‘0‘) { if(ch==‘-‘) f=-1; ch=getchar(); } while(ch>=‘0‘&&ch<=‘9‘) x=(x<<1)+(x<<3)+(ch^48),ch=getchar(); x*=f; return; } inline int max(const int &a,const int &b) {if(a>b) return a;else return b;} inline int min(const int &a,const int &b) {if(a<b) return a;else return b;} inline int abs(const int &x) {if(x>0) return x;else return -x;} inline void swap(int &a,int &b) { int c=a;a=b;b=c;return; } int n,m,frog[maxn][20],LOG[maxn],a,b; int main() { qr(n);qr(m); for(int i=1;i<=n;++i) {qr(frog[i][0]);LOG[i]=log2(i);} for(int j=1;j<=21;++j) { for(int i=1;i<=n;++i) { if(i+(1<<j)-1>n) break; frog[i][j]=max(frog[i][j-1],frog[i+(1<<(j-1))][j-1]); } } while(m--) { a=b=0;qr(a);qr(b);int &t=LOG[b-a+1]; printf("%d\n",max(frog[a][t],frog[b-(1<<t)+1][t])); } return 0; }
标签:直接 ++ 预处理 左右 char through ini st表 max
原文地址:https://www.cnblogs.com/yifusuyi/p/9281250.html