博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
模板 - ST表
阅读量:4553 次
发布时间:2019-06-08

本文共 1405 字,大约阅读时间需要 4 分钟。

\(O(nlogn)\)预处理,\(O(1)\)查询。注意不要越界。

\(f[i][j]\) 表示 \([i,i+2^j-1]\) 的最大值。

显然, \(f[i][0]=a[i]\)

根据定义式,写出状态转移方程: \(f[i][j]=max(f[i][j-1],f[i+2^{j-1}][j-1])\)

我们可以这么理解:将区间 \([i,i+2^j-1]\) 分成相同的两部分

中点即为 \((i+(i+2^j-1))/2=i+2^{j-1}-1/2\)

所以 \([i,i+2^j-1]\) 可以分成 \([i,i+2^{j-1}-1]\)\([i+2^j,i+2^j-1]\)

对于每个询问 \([x,y]\) ,我们把它分成两部分 \(f[x][s],f[y-2^s+1][s]\)

其中 \(s=log_2(y-x+1)\) ,虽然这两个区间有重叠,但是重叠不会影响区间的最大值。


#include 
using namespace std;#define ll long long//既然使用ST表,就是要尽可能卡常inline int read() { char c=getchar(); int x=0,f=1; while(c<'0'||c>'9') { if(c=='-') f=-1; c=getchar(); } while(c>='0'&&c<='9') { x=x*10+c-'0'; c=getchar(); } return x*f;}class ST_Table {private: static const int MAXLOGN=17; static const int MAXN=100000; int logn[MAXN+5]; int f[MAXN+5][MAXLOGN+1];public: inline void init1() { logn[1]=0; for(int i=2; i<=MAXN; i++) { logn[i]=logn[i/2]+1; } } inline void init2(int n) { //或者改成从数组中复制也可以 for(int i=1; i<=n; i++) f[i][0]=read(); for(int j=1; j<=MAXLOGN; j++) for(int i=1; i+(1<
<=n; i++) f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]); } inline int range_max(int l,int r){ int s=logn[r-l+1]; return max(f[l][s],f[r-(1<

转载于:https://www.cnblogs.com/Yinku/p/10964210.html

你可能感兴趣的文章
血液循环结构
查看>>
SQL Server统计数据库中表个数、视图个数、存储过程个数
查看>>
设计模式:观察者模式
查看>>
课程总结
查看>>
openstack新建虚机、网络、路由时候对应的ovs网桥的变化
查看>>
linux 编译运行c文件
查看>>
Scrapy的学习和使用
查看>>
7.内部类(一)之详解内部类
查看>>
1.messager消息提示框
查看>>
[PY]进制转换
查看>>
STL系列 list
查看>>
匿名方法和Lambda表达式
查看>>
京东的核心业务
查看>>
读书笔记(六)--成交
查看>>
Secret Number hdu 2113
查看>>
软件架构(体系结构,Architecture)和软件框架
查看>>
阶梯博弈(没怎么搞懂)
查看>>
python request post请求body中有json数组
查看>>
IDT hook KiTrap03
查看>>
字节对齐
查看>>