活用各种数据结构——RMQ/树状数组/分桶法和平方分割

对《挑战程序设计竞赛》的一个记录

第三章 出类拔萃——中级篇

上一篇:3.3活用各种数据结构——线段树篇

3.3活用各种数据结构——RMQ/树状数组/分桶法和平方分割

RMQ(区间最值查询)

有一个长度为n的乱序序列,要求求出区间[L,R]内的最大值或最小值(或者有多次询问发生)
(1)普通解法:每次询问遍历一遍数组(效率低,n很小时,可以考虑一下)
(2)ST算法:具体看之前写过的这篇,ST算法可以进行O(1)的查询,但是不能维护值得更改,适合用在需要大量询问,但是不改变值得情况下。
(3)线段树:可以看线段树篇内的习题
(4)树状数组:树状数组见下面详解
用树状数组求区间[L,R]最值时,如果待查区域在[L,R]范围内,则去该区域最值,否则,只取当前位置的数据,索引后减1并重复上述步骤,直至全部查询完

int getMax(int r,int l)
{
    int ans = val[r];
    while(l <= r)
    {
        ans = max(ans,val[r]);
        for(--r; r - l >= lower_bit(r);r -= lower_bit(r))
        {
            ans = max(ans,cnt[r]);
        }
    }
    return ans;
}

(5)平方分割:见下面详解
(6)。。。待补充

树状数组

经常用到YB学长的这份自己整理的资料,觉得挺好,直接贴上来记录一下(侵删,勿转载)

单一更新区间查询
树状数组的原英文表达:Binary Indexed Tree(BIT),直译的意思便是:二进制标记树。这提示我们,树状数组这种数据结构的原理是二进制数。
如果数组A是基础数组,数组C是区间数组。那么,在具体介绍数组C的特点前,先给出如下的树状关系图:
这里写图片描述

仔细观察上图,容易发现:
数组C[]分别代表的区间为:
C1=A1 [1,1]
C2=C1+A2=A1+A2 [1,2]
C3=A3 [3,3]
C4=C2+C3+A4=A1+A2+A3+A4 [1,4]
C5=A5 [5,5]
C6=C5+A6=A5+A6 [5,6]
C7=A7 [7,7]
C8=C4+C6+C7+A8=A1+A2+A3+A4+A5+A6+A7+A8 [1,8]
C9=A9 [9,9]

也就是说,每个数组Ci,至少包含Ai,同时包含所有满足j+lowest_bit(j)=i的Cj数组。例如C8不仅包含A8,同时还包含了C4,C6,C7。而
410=10021002+1002=10002=810
610=11021102+

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值