分块套树状数组
简介
分块套树状数组在特定条件下可以用来做一些树套树可以做的事情,但是相比起树套树,分块套树状数组代码编写更加简短,更加容易实现。
简单的例子
一个简单的例子就是二维平面中矩阵区域内点数的查询。
矩形区域查询
给出
- 给出
,询问以 为左上角, 为右下角的矩形区域内点的个数。 - 给出
,将横坐标为 的点的纵坐标改为 。
题目 强制在线,保证
对于操作 1,可以通过矩形容斥将其转化为 4 个二维偏序的查询去解决,然后因为强制在线,CDQ 分治之类的离线算法就解决不了,于是想到了树套树,比如树状数组套 Treap。这确实可以解决这个问题,但是代码太长了,也不是特别好实现。
注意到,题目还额外保证了
初始化
首先,一个
然后,以
查询
对于操作 1,将其转化为 4 个二维偏序的查询。现在只需要解决给出
现在要查询横坐标的范围为
现在就只需要处理完整的块。暴力扫一遍前面的块,查询每个块对应的树状数组中值小于
这就完事了?不,注意到处理完整的块的时候,其实相当于查询
修改
普通的做法就先找到点
如果用了上面说的优化,那就是对
对上述步骤进行一定的改变,比如将一减一加改成只减,就是删点;改成只加,就是加点。但是必须要注意一个
空间复杂度
分块分了
时间复杂度
查询的话,遍历非完整块的段
修改和查询一样,复杂度为
例题 1
Intersection of Permutations
给出两个排列
- 给出
,要求查询既出现在 又出现在 中的元素的个数。 - 给出
, 。
序列长度
对于每个值
参考代码(分块套树状数组 - 1s)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
|
参考代码(树状数组套 Treap—TLE)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 |
|
例题 2
Complicated Computations
给出一个序列
序列的长度
观察:一个序列的 MEX 为
依次判断是否存在 MEX 为
在判断
用一个数组
如果在判断完值为
参考代码(分块套树状数组 - 78ms)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
|
参考代码(线段树套 Treap-468ms)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 |
|
本页面最近更新:2024/10/9 22:38:42,更新历史
发现错误?想一起完善? 在 GitHub 上编辑此页!
本页面贡献者:Backl1ght, Enter-tainer, Ir1d, ksyx, leoleoasd, Tiphereth-A, Xeonacid
本页面的全部内容在 CC BY-SA 4.0 和 SATA 协议之条款下提供,附加条款亦可能应用