随笔分类 - 数据结构——平衡树
摘要:Description 维护一个数列的如下操作: 在某个位置后插入一段数列 在某个位置后删除一段数列 将连续的一段数列修改为某个值 将一段数列翻转 求一段数列的和 求整个数列的最大子段和 Solution 魔鬼Splay题 用Splay维护序列,以下标为权值建树。 如果插入一段序列,我们就将这段序列
阅读全文
摘要:Description 给定一棵树,求它的最小点权覆盖集,其中允许强制某个点选或不选 Solution ddp用LCT维护 明确一个关系式:最小点权覆盖集=全集-最大点权独立集 那么n≤2000的暴力就很简单了,暴力修改,然后求最大点权独立集就好了(我在考场上就是这么写的) 关于正解,我采用的是动态
阅读全文
摘要:Description 给定一张无向图,边有a,b两种边权,求一条1~n的路径,使得路径上a最大值与b最大值之和尽可能小 Solution LCT维护生成树 将边按照a从小到大排序,然后顺序考虑每一条边 如果当前这条边的两个端点没有联通,那么直接在LCT上连边即可 如果当前这条边的两个端点已经连通,
阅读全文
摘要:Description 给定一张n个点,m条边的无向图,求出边权最大值和最小值差值最小的生成树 Solution LCT+并查集 按照最小生成树的思路,先将边按照边权从小到大排序,然后顺序考虑每一条边 如果当前这条边的两个端点没有连通,那么直接连通 如果两个端点已经连通,我们加上这条边会形成一个环,
阅读全文
摘要:Description 给定n个点的树,每个点有点权,维护如下操作: 将某一条链上的点的点权加或者乘一个数 将原有的一条边删除,加入一条新边,并保证操作完之后是一棵树 询问某一条链上所有点权之和 Solution LCT维护 每一个点维护如下信息:父亲,儿子,点权,子树大小,子树的点权和,翻转标记,
阅读全文
摘要:Description 设计一种数据结构,支持给指定点插入元素并覆盖先前的元素、查询某一点的排名、输出从任意排名之后的10名。 Solution 采用Splay实现 关于读入的字符串,我们可以哈希然后将哈希值丢到map里,这样就可以给每一个字符串一个编号,方便在Splay上操作。 关于插入和删除以及
阅读全文
摘要:Description 维护一种数据结构,并支持区间翻转、区间加、查询区间最大的操作 Solution Splay模板题,以序列中每个元素的下标为权值建立平衡树,维护两个标记:区间翻转和区间加标记,标记下传可以仿照线段树。 剩下的就是模板了 Code 1 #include <bits/stdc++.
阅读全文
摘要:Description 设计一种数据结构,支持元素的插入,查询当前元素的中位数 Solution 为了练习Splay,我决定用牛刀杀鸡,用Splay解决对顶堆的问题。 然后这就是一道Splay的模板题(简化简化再简化) Code 1 #include <bits/stdc++.h> 2 using
阅读全文
摘要:普通平衡树 Description 设计一种数据结构,支持插入元素,删除元素,查询值为val的元素的排名,查询排名为rnk的值,查询x的前驱、后驱 Solution Splay的基本操作,熟悉一下Splay,这些操作事实上与Treap也能解决。 为了实现Splay,我们有如下定义及实现方法。 1.定
阅读全文
摘要:Description Treap是一种简单的平衡树,可以实现插入元素,删除元素,求元素的排名,求排名为某某的元素,查询前驱后驱 treap的本质是一棵二叉搜索树。然而,二叉搜索树很容易使复杂度退化,所以我们在每个节点上产生一个随机值,按照堆的性质维护,这样treap的深度期望为logn。 在本题中
阅读全文

浙公网安备 33010602011771号