寒假集训DAY2数据结构

小练习

给定序列 S = a1,a2,··· ,an,建立一张 n 个点的空图。对于平方串 S[i: i+L−1] = S[i+L: i+2L−1],我们会给图中 i+j−1 和 i+2j−1 连一条边,边权为 wL,其中 j = 1,2,··· ,L。求该图的最小生成树。 n≤ 3×10^5,1 ≤wi ≤ 10^9。

因为边权的种类只有n种可以考虑枚举边权,用计算平方串的经典方法,按L分块对每块起点和下一块起点求lcs,lcp设为l,r如果r-l+1>=L说明合法

此时应该连r-l+1条边,用萌萌哒那个做法建nlog个并查集维护,就可以将r-l+1条边拆成2次并查集的合并,若两并查集没有合并,则一直递归并记录答案

因为每次递归都必定一次merge,而只有nlog个点所以O(nlog^2)

LOJ 2018 「AHOI / HNOI2017」单旋

维护一棵 BST 如下: 1 插入一个权值为 k 的节点,输出插入位置的深度; 2 输出最小值的深度,然后将其旋转到根; 3 输出最大值的深度,然后将其旋转到根; 4 进行操作 2 后删除根节点; 5 进行操作 3 后删除根节点; 其中旋转为不断进行平衡树的单旋直到为根为止。 q≤ 10^5,k≤ 10^9。

首先最小值和最大值的性质相同,只谈讨最小值的做法。

画张图就会发现,在单旋树上最小值旋转到根实际等价于两步操作,lson[fa]->rson[u],rson[u]->root

所以开一颗真的平衡树每个节点维护一个单旋树上的节点的结构体,里面维护lson,rson,fa,dep,key

深度变化就是除了u及u的右子树外深度+1,可以打懒标记全体+1然后令右子树-1实现

找到右子树的方法,记录u及fa[u]的key,那么右子树由所有中间key构成,链上修改

插入时虽说在splay里随便放但要确定在原树中的位置,所以找到key 的pre,nxt,显然他们有祖先关系,兄弟就有key夹在中间不可能

如果pre是nxt父亲那nxt的左儿子就空着插那,否则就插pre的右儿子,可以通过深度判断祖先关系

删除直接删,懒标记全体-1

LOJ 2001 「SDOI2017」树点涂色

给定 n 个点的树,初始时第 i 个点颜色为 i。三种操作: 1 把 x 到根的路径上所有点染上一种新的颜色; 2 求 x 到 y 路径上不同的颜色个数; 3 从 x 的子树中选择一个点,使其到根节点的路径上,不同的颜色 个数最大。 n,q≤ 10^5。

...

猜你喜欢

转载自www.cnblogs.com/hzoi2018-xuefeng/p/12296456.html