RMQ算法模板
2024-10-19 03:36:57
分别写了下标从0和1开始的两种
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std; const int maxn=1e5+;
const int maxl=; int ma[maxn][maxl];
int st[maxn][maxl];
int a[maxn],prelog[maxn]; void initRMQ(int n){
for(int i=;i<=n;++i){
prelog[i]=prelog[i-];
if((i&(-i))==i)prelog[i]++;
}
for(int i=;i<=n;++i)ma[i][]=a[i];
for(int j=;(<<j)<=n;++j){
for(int i=;i+(<<j)-<=n;++i){
ma[i][j]=max(ma[i][j-],ma[i+(<<j-)][j-]);
}
}
} int askRMQ(int l,int r){
if(l>r)swap(l,r);
int k=prelog[r-l+];
return max(ma[l][k],ma[r-(<<k)+][k]);
} void initST(int n){
for(int i=;i<=n;++i){
prelog[i]=prelog[i-];
if((<<prelog[i]+)==i)++prelog[i];
}
for(int i=;i<n;++i)st[i][]=a[i];
for(int i=n-;i>=;--i){
for(int j=;i+(<<j)-<n;++j){
st[i][j]=max(st[i][j-],st[i+(<<j-)][j-]);
}
}
} int askST(int l,int r){
if(l>r)swap(l,r);
int k=prelog[r-l+];
return max(st[l][k],st[r-(<<k)+][k]);
}
最新文章
- Web前端开发css基础样式总结
- 解决tomcat启动Socket监听端口死循环被hold问题
- [Angularjs]ng-switch用法
- 学习总结 java 创建及其练习
- ASP.NET,web.config 中SessionState的配置
- idl生成.h .c文件
- NDK编译Python2.7.5
- ecshop的aes加密(封装)
- ant+eclipse知识点详解及使用案例
- shell编程企业级实战(2)
- Centos 安装 mysql yum
- Meterpreter常⻅见⽤用法
- svn 更新
- Ajax简单整理-思维导图
- JSON实例(单对象)
- 读取SD卡中的图片
- BZOJ3427 Poi2013 Bytecomputer 【dp】
- vector的内存分配机制分析
- CodeForces Round #515 Div.3 A. Vova and Train
- Web前端开发规范【HTML/JavaScript/CSS】