一种基于分块的数据结构
Hiiragi_Utena · · 算法·理论
前言:这种数据结构于笔者在 4 个多月之前口胡出来,可能已有前人发现。若有,希望可以指出。
1 基本结构
考虑一个有序数组,支持如下操作:
- 第
i 个数和第i+1 个数之间单点插入。 - 单点删除。
- 查询下标
i 的数值。
这是一道块状链表的模板题,但是如果要求询问
不妨设数组的最大长度为
对于每一块,使用一个长度为
查询时,可以直接找到对应的数,
插入时,找到对应的块,
删除类似。
2 对于容易求逆操作的区间修改,单点查询
和块状链表类似,这个数据结构也可以打懒标记。
插入/删除时,需要的操作是将一个没有标记的数加入一个有标记的块中,此时需要求逆运算。
若该运算不满足交换律,在区间修改时处理散块也需要求逆。
3 对于不容易求逆、满足结合律操作的区间修改,单点查询
对于每个节点,都需要再维护一个时间,表示该节点什么时候加入本块中。
于是可以将问题转化为:查询之前某个时间到现在为止的标记总和。
由于满足结合律,可以使用线段树实现。
插入/删除:
区间修改:
若满足交换律,则区间修改为
特别的:若操作为区间赋值,则可以不用线段树维护,每个块维护最晚一次懒标记的时间与标记本身。插入/删除、修改都是
4 区间查询
每个块维护整块信息,区间询问
5 总结
和块状链表相比,