Day1 上午——高级数据结构
一、树状数组
基本功能
1.单点修改,前缀信息查询
2.区间修改可减信息,单点查询
对lowbit的理解
保留x中最后一位1(由位运算实现)1
#define lowbit(x) (x&-x)
例题一:矩形数点
给定$n$个点坐标($x_i$,$y_i$),q次询问,每次询问给出一个矩形的右上角坐标和左下角坐标,求矩形内包含给定点的个数
n, q $\leq$ $10^5$,0 $\leq$ $x_i$, $y_i$ $\leq$ $10^9$
思路
首先用容斥原理把矩形拆型四个二维偏序区域(形如$\sum$[$x_i$ $\leq$ $x$, $y_i$ $\leq$ $y$])
将数据离散化,排序,此时$x$自然满足偏序结构,用树状数组根据$y$值维护前缀和即可
复杂度
O((n+q)logn)
例题二:逆序对
给定一个长度为$n$的序列,可以将其中任意个数字取相反数,求可以得到的最少逆序对数
$n$ $\le$ $10^5$,$\left|A_i \right|$ $\le$ $10^9$
思路
对于每个数字,我们发现$A_i$的正负只影响绝对值比$A_i$小的数,所以求出每个数$A_i$前后分别有多少数绝对值大于$A_i$,取较少的那一个就行了
二、线段树
例题一、序列操作
给定长度为$n$的序列$A$,执行$q$次操作,支持区间加、区间赋值、查询区间和、查询区间最大值
思路
线段树模板
例题二、环上连续最大和
给定一个长度为$n$的环形序列$A$,其中$A_1$与$A_n$是相邻的。$q$次操作,每次操作更改$A_x=v$。对于每次修改输出最大连续和
$n,q\le10^5,1\le x\le n,\left|A_i\right|,\left|v\right|\le10^9$
思路
线段树维护一下最小前缀和,最小后缀和与最小连续和,考虑到题目中的序列为环形,最大环形序列可能是两段互不相交的前缀与后缀,用总和减去最小子序列就行了。
例题三、SDOI2016 游戏
题面见P4069
思路
树链剖分+李超线段树
代码
1 |
|
三、可并堆(左偏树)
左偏树呈二叉树结构,除维护权值信息外,还需要维护子树内最近叶结点的距离$d_x$。
例题一、Dispatching
题面见P1552。
思路
考虑到如果某个忍者当管理员时不选$x$忍者,那么这个忍者的直接上级一定不会选$x$。
使用左偏树维护以$x$为根子树内派遣忍者名单,它需要满足大根堆的性质,不断删除堆顶直到总和$\le m$。
代码
1 |
|
线段树的合并
线段树要合并,必须要有相同的结构,均摊复杂度$O(log n)$。
四、平衡树
Treap——Treep=Tree+Heap
Treap通过单旋保持堆性质。树高期望$O(logn)$
启发式合并
合并两棵$Treap$的时候,只需要暴力遍历较小的 Treap 提取所有结点,然后依次插入到较大的$Treap$之中就好了。
很多数据结构都可以用启发式合并
例题一、Peaks
题面见P4197
思路
将道路和询问混在一起排序,进行$Kruskal$算法的同时用$Treap $维护连通分量内所有山峰的高度。
Splay
Splay借助双旋操作(zig_zag)。
例题二、序列终结者
题面见P4146。
思路
Splay维护翻转、子树最值、addv标记。
例题三、三维偏序
思路
线段树套平衡树
Day1 下午
五、嵌套数据结构
嵌套数据结构的思想是将普通的数据结构维护的信息拓展成另一
种数据结构(可能与第一维数据结构相同)
树套树
常见的有树状数组套平衡树,线段树套权值线段树等。
注意,第一维的数据结构应该尽量简单,可以节约空间减小时间复杂度。
例题一、Mokia
题面见P4390。
思路
树状数组套Splay
六、可持久化线段树(主席树)
可持久化数据结构
可持久化数据结构就是利用函数式编程的思想使其支持询问历史版本,同时充分利用它们之间的共同数据来减少时间和空间消耗
大致的思想就是只新建不修改,保存历史版本
例题一、静态区间第k小
题面见P3834。
思路
主席树模板题
七、动态树(Link-Cut-Tree)
不是很懂。。。弄明白以后再补
总结
数据结构是很重要的基础。
讲课好快…今天的例题只敲出来两个,其他的还得以后慢慢做