分块套树状数组
简介
分块套树状数组在特定条件下可以用来做一些树套树可以做的事情,但是相比起树套树,分块套树状数组代码编写更加简短,更加容易实现。
简单的例子
一个简单的例子就是二维平面中矩阵区域内点数的查询。
给出
-
给出
,询问以 为左上角, 为右下角的矩形区域内点的个数。 -
给出
,将横坐标为 的点的纵坐标改为 。
题目 强制在线,保证
对于操作 1,可以通过矩形容斥将其转化为 4 个二维偏序的查询去解决,然后因为强制在线,CDQ 分治之类的离线算法就解决不了,于是想到了树套树,比如树状数组套 Treap。这确实可以解决这个问题,但是代码太长了,也不是特别好实现。
注意到,题目还额外保证了
初始化
首先,一个
然后,以
查询
对于操作 1,将其转化为 4 个二维偏序的查询。现在只需要解决给出
现在要查询横坐标的范围为
现在就只需要处理完整的块。暴力扫一遍前面的块,查询每个块对应的树状数组中值小于
这就完事了?不,注意到处理完整的块的时候,其实相当于查询
修改
普通的做法就先找到点
如果用了上面说的优化,那就是对
对上述步骤进行一定的改变,比如将一减一加改成只减,就是删点;改成只加,就是加点。但是必须要注意一个
空间复杂度
分块分了
时间复杂度
查询的话,遍历非完整块的段
修改和查询一样,复杂度为
例题 1
给出两个排列
-
给出
,要求查询既出现在 又出现在 中的元素的个数。 -
给出
, 。
序列长度
对于每个值
例题 2
给出一个序列
序列的长度
观察:一个序列的 MEX 为
依次判断是否存在 MEX 为
在判断
用一个数组
如果在判断完值为
贡献者:@Ir1dXD@mgt@Leo@Xeonacid@Zhikai@Backl1ght
本页面最近更新:2/3/2023, 12:00:00 AM,更新历史
发现错误?想一起完善? 在 GitHub 上编辑此页!
本页面的全部内容在 CC BY-SA 4.0 和 SATA 协议之条款下提供,附加条款亦可能应用