博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法笔记--st表
阅读量:6655 次
发布时间:2019-06-25

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

概述:用倍增法求区间最值的离线算法,O(nlogn)预处理,O(1)访问。

预处理:

  状态:st[i][j]:[i,i+2^j)之间的最值  

  状态转移:如果j等于0,st[i][j]=a[i]

       如果j大于0,st[i][j]=max(st[i][j-1],st[i+2^(j-1)][j-1])或st[i][j]=min(st[i][j-1],st[i+2^(j-1)][j-1])

访问:

  求[l,r]区间里的最值

  k=floor(log(r-l+1))

  ans=max(st[l][k],st[r-2^k+1][k])或ans=min(st[l][k],st[r-2^k+1][k])

模板:

int st[N][20],a[N];void init_st(int n){    for(int i=n;i>=1;i--){        st[i][0]=a[i];        for(int j=1;i+(1<
<=n;j++){ st[i][j]=min(st[i][j-1],st[i+(1<

 例题:

思路:求区间最值差

代码:

#include
#include
#include
#include
#include
using namespace std;#define ll long long#define pb push_back#define mem(a,b) memset(a,b,sizeof(a))const int N=1e5+5;int ss[N][20],st[N][20],a[N];void init_st(int n){ for(int i=n;i>=1;i--){ st[i][0]=a[i]; ss[i][0]=a[i]; for(int j=1;i+(1<
<=n;j++){ st[i][j]=min(st[i][j-1],st[i+(1<
>n>>q; for(int i=1;i<=n;i++)cin>>a[i]; init_st(n); while(q--){ cin>>l>>r; cout<
<
View Code

参考:

转载于:https://www.cnblogs.com/widsom/p/8320838.html

你可能感兴趣的文章
20120622第二天_面向对象\02面向对象
查看>>
[翻译].NET框架中的缓存
查看>>
Microsoft Visual Studio 2010 正式版下载[含旗舰版序列号](中、英文版)
查看>>
心惊胆战的多屏图片切换
查看>>
office excel读写类NPOI
查看>>
技术支持经验总结
查看>>
正则教程
查看>>
如何使用Exchange Web Service获取日历(包含循环会议)
查看>>
C# DEV XtraGrid
查看>>
【SAS NOTES】data set if
查看>>
关于C#的Process的内存相关属性解读
查看>>
Android 编程下快捷图标的创建
查看>>
C++ GUI Qt4 自学笔记——Qt qmake命令
查看>>
烂透了与棒极了
查看>>
修改10g自动统计信息收集作业GATHER_STATS_JOB到仅仅周末执行
查看>>
Calibrate测试Exadata IO
查看>>
【C语言】15-预处理指令1-宏定义
查看>>
【C语言】19-static和extern关键字1-对函数的作用
查看>>
分享:C++中头文件、源文件之间的区别与联系
查看>>
好类 笔记
查看>>