数据结构总结

· · 个人记录

数据结构常见知识点

trick

technology

高维离散化

对于一个数 x,其在序列中出现了 y

开个 vectorv[1],v[2]...v[y] 中都 push_back(x),然后对于每个 vector 分别进行离散化。 保证了空间线性。

线段树&平衡树

线段树五问:

1、每个区间需要记录哪些值?

2、需要哪些标记?

3、如何叠加标记(在原有标记的区间增加新的标记?)

4、如何对区间进行整体修改?

5、如何合并区间?

打上各种 tag

这个不用多说。区间加、区间乘、区间推平、区间翻转、区间 \mathrm{xor}。。。

维护前缀、后缀和整体信息

比如最大子段和。一般用于处理最优子段问题。

拆式子

面对难以维护的式子,我们可以考虑把它拆开分别维护,比如区间方差、区间 \sin 和。

维护很多维的信息

当我们发现题目中一个方面难以维护但相关维度的数据范围较小的话,我们可以考虑直接维护这些信息。比如那个五维的曼哈顿距离 \max 题。

观察所求东西在分治结构中的贡献

比如说区间询问所有数两两乘积之和,这个当然可以拆成和的平方减平方的和再除以 2 之类的,但我们也可以算左二子答案 + 右儿子答案 + 左右儿子的和的乘积。

与二分结合

这个其实有很多东西的,在这里数据结构做的事大概是求值并判定。

二维数点

二位的信息可以向二维数点的方向思考。

静态的话可以尝用主席树做 1\log

均摊

常见的有颜色段均摊,这个就是 ODT。

还有值域上减小次数的均摊。注意证明复杂度。同时,可以考虑最坏情况下总体完整的操作次数来达到均摊。

在值域均摊的同也可以考虑颜色段均摊,如 UOJ228。

减少状态

可以利用一些性质,如单调性来减少需要维护的信息数量。

其他的东西

分块&莫队

分块和莫队有着较强的问题处理能力,能解决许多分治结构难以处理的问题。

动态分块:

暴力维护+打tag

。。。

块内维护有序数组

区间加法操作时,整块打标记,零散块归并重构。

各种根号平衡 。。。

莫队

理想莫队信息:维护一个子集的信息,支持 O(a) 插入一个元素,O(b) 删除一个元素,无法比直接暴力更高效地合并。

莫队是 O(n\sqrt m) 的!!!

套用根号平衡

莫队相当于有 O(n\sqrt m) 次修改(转移),而只有 O(m) 次询问。

所以在每次询问的时候可以套用大量 O(1)-O(\sqrt n) 的东西。

尝试降维

把高维莫队降成低维的!

常见降维方法:差分。

莫队二次离线

维护的是可差分的信息。

转化为前缀相减的问题。

树上莫队

用括号序维护,(:插入,):删除。

带修莫队

加上时间线,升维一下就好了

自然根号

不自然的根号