首页 技术 正文
技术 2022年11月15日
0 收藏 548 点赞 4,246 浏览 777 个字

RMQ(Range Minimum/Maximum Query)区间最值查询,即给出长度为n的数组A,以及m组询问s、t(s<=t<=n),返回区间[s,t]中的最值。

基于线段树的方法实现的话,建树O(n),查询O(logn),相比ST,适合用于n更大,m较小的情况。

void built(int k, int l, int r)
{
if (l==r) t[k] = a[l]; //到叶子上,则赋值
else {
built(k*2+1, l, (l+r)/2); //左儿子
built(k*2+2, (l+r)/2, r); //右儿子
t[k] = min(t[k*2+1], t[k*2+2]); //回溯赋值
}
}
void update(int k, int a)
{
//叶子节点
k += n-1;
t[k] = a;
//向上更新
while (k>0) {
k = (k-1)/2;
t[k] = min(t[k*2+1], t[k*2+2]);
}
}
int query(int a, int b, int k, int l, int r) //查询区间[a,b], 当前查询结点的位置为k, 所表示的区间为[l,r],默认k为根结点
{
if (r<=a||b<=l) return INF; //当前区间与所查询区间无交集,返回一个不影响答案的值
if (a<=l&&r<=b) return t[k]; //当前区间包含于所查询区间,直接返回当前区间的最值就好了
else {
int vl = query(a, b, k*2+1, l, (l+r)/2); //查询左儿子
int vr = query(a, b, k*2+1, (l+r)/2, r); //查询右儿子
return min(vl, vr);
}
}

https://blog.csdn.net/zearot/article/details/48299459

https://blog.csdn.net/lian233/article/details/58250641

上一篇: 掌握数位dp
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,955
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,479
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,291
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,108
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,740
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,774