各种数据结构的知识点归纳
By SemiWaker
各种莫队
普通的莫队
设x所在块的编号为BID[x]。
把所有询问[L,R]按照(BID[L],R)的二元组去排序。
从第一个询问开始,每次暴力移动询问区间。
暴力移动的过程中,将L和R每次移动一个,加入或者删除区间的端点。
因为每次只会加入或者删除一个,而且空间只需要维护一个区间的信息,所以可以完成大多数区间询问。
当信息不满足结合律时,不能用树形结构,此时莫队算法就有用了。
分块大小为 n√ ,总时间复杂度 O(nn√)
小优化:当下一个询问的R比当前询问的R小,说明已经遍历了一次了。这时不需要一个一个地将R往左移动,直接从下一个询问开始即可。
带修莫队
考虑加入修改信息。
将询问设为[T,L,R],T是第T次修改后的意思。
那么按照(BID[T],BID[L],R)的三元组进行排序,重复莫队的过程即可。
考虑修改,因为我们会加入和取消某一次修改,所以每一次修改都要记录修改前的和修改后的信息。
如果修改在[L,R]之间,就要计算贡献。
如果修改不在[L,R]之间,直接在外面修改。
块的大小为 n