数据结构
dinlon
这个作者很懒,什么都没留下…
展开
-
方案计数(带修计数题/线段树)
方案计数对于一个n个队员,每个队员有一个权值Vi,然后每次选择三个权值相同的A类队员,两个权值小于A类的B类队员,并且B类队员要在A类队员两侧。Q次操作,每次限制或解除限制一个队员成为A类队员。首先枚举中间的A类队员,然后可以维护每个数前面比它小的个数和后面比它小的个数,这样通过前缀和的乘积就可以计算出答案。然后考虑每次修改的影响,如果是当前点作为中间点可以用类似方法解决,否则我们发现现在求解的每个每个后缀和前面都有一个i的系数,看到这种东西可以熟练的想到交换枚举顺序,然后就变成了后缀和的二维后缀和原创 2021-02-22 23:00:15 · 88 阅读 · 1 评论 -
AT2645 [ARC076D] Exhausted?(Hall定理推论/线段树+扫描线)
AT2645 [ARC076D] Exhausted?对于一个二分图左边点连接的是右边点的一个前缀和一个后缀,求解最大匹配。首先不能直接求解最大匹配,但是我们可以利用Hall定理的推论求解∣U∣−max(∣X∣−N(∣X∣))|U|-max(|X|-N(|X|))∣U∣−max(∣X∣−N(∣X∣))现在需要让∣S∣−(m−⋂i∈S[li,ri])|S|-(m-\bigcap_{i\in{S}}[l_i,r_i])∣S∣−(m−⋂i∈S[li,ri])最大,也就是让∣S∣+⋂i∈S[li,ri原创 2021-02-17 08:39:05 · 99 阅读 · 0 评论 -
数据结构复习
数据结构two permutation平衡树维护哈希值合并启发式合并适合只有合并没有拆分的问题树链剖分左偏树fhq_treap合并满足一颗子树内的所有节点都小于另一颗子树排布石头平衡树启发式合并树上启发式合并树上的子树问题,比如树上众数问题全局维护数据结构,可以不好合并,但是只需要单点插入单点删除即可。CCPC Final 2019 K对树上每个点维护子树内所有点编号构成的连续段个数笛卡尔树满足堆性质的二叉树,中序遍历为原序列,每个点为其子树的最值,常用来处理区间最值相关原创 2021-02-10 15:15:36 · 89 阅读 · 0 评论 -
P5055 【模板】可持久化文艺平衡树
P5055 【模板】可持久化文艺平衡树突然发现fhq_treap也是可以支持区间翻转的,所以基本上和其他平衡树是一样的,而且还满足重量平衡树的性质,真是太优秀了,只不过常数稍微比较大。然后这里我们变成了一颗区间平衡树,需要支持以下几个操作。若 opti=1,则接下来两个整数 pi,xi,表示操作为在第 pi个数后插入数 x。若 opti=2,则接下来一个整数 pi,表示操作为删除第 pi个数。若 opti=3,则接下来两个整数 li,ri,表示操作为翻转区间 [li,ri]。若 opti=4原创 2021-02-06 17:36:39 · 109 阅读 · 0 评论 -
P3835 【模板】可持久化平衡树
P3835 【模板】可持久化平衡树好久没有打平衡树了,赶紧来复习一下,平衡树这种东西还是很有用的,可以很灵活地解决一些问题。fhq_treap这道题是可持久化的权值平衡树,支持以下几个操作1、 插入 xxx2、 删除 xxx(若有多个相同的数,应只删除一个,如果没有请忽略该操作)3、 查询 xxx 的排名(排名定义为比当前数小的数的个数 +1+1+1)4、查询排名为 xxx 的数5、 求 xxx 的前驱(前驱定义为小于 xxx,且最大的数,如不存在输出-1)6、求 xxx 的后继(后继定义原创 2021-02-06 15:34:41 · 107 阅读 · 0 评论 -
[2021.1.31多校省选模拟12]随机变换的子串(线段树维护分治/字符串/自动机思想)
[2021.1.31多校省选模拟12]随机变换的子串对于这三种操作,我们惊奇地发现有这样的性质,所有长度大于4的字符串都可以通过变换变为长度小于等于4的字符串,那么查询本质不同的字符串我们只需要处理12种字符串的出现次数即可。然后对于区间所有字符串数量级是O(n2)O(n^2)O(n2)的,所以我们考虑分治处理,那么将分治用一个数据结构维护下来,那就是一颗线段树了,然后考虑需要哪些信息,我们需要维护所有前缀信息和后缀信息以及整个串信息。考虑如何快速合并信息,这个思想就很巧妙了,就是对这12个串建立一个原创 2021-02-01 12:59:12 · 68 阅读 · 0 评论 -
[2021.1.27多校省选模拟10]跑步(线段树合并)
[2021.1.27多校省选模拟10]跑步经典的树上启发式合并题目,维护对应子树的从当前点到子树内一个节点这个链待定,其他部分已经确定的方案数,这个东西按照对应点到根节点的路径点权和为下标存在一个权值线段树中,然后维护这个权值线段树可以线段树合并。然后考虑如何统计链完全匹配完成时的方案数,我们可以考虑每次合并前查询答案,相当于是对一段后缀进行询问权值和,可以进行线段树上二分,因为我们要求权值和大于等于0。然后先询问再合并,这样可以保证任意两个链都会被统计到,这个套路还是比较常见的,而且这样的复杂度就变原创 2021-01-28 15:50:55 · 65 阅读 · 0 评论 -
【BZOJ4028】[HEOI2015]公约数数列(分块/数量级很小法)
【BZOJ4028】[HEOI2015]公约数数列https://www.luogu.com.cn/problem/P4108求解最靠前的一个位置前缀gcd和前缀异或的乘积恰好等于x,并且要求支持单点修改首先我们可以发现这个问题没法使用线段树维护,因为不仅前缀没有单调性,而且修改也难以处理,所以我们考虑分块。首先单点修改就变得很简单了,直接对应块暴力重构即可,然后查询的时候利用到一个性质,就是本质不同前缀gcd只有O(logn)种,对于块内gcd会改变的的只有O(logn)块,对于这些块暴力处理,对原创 2021-01-17 11:29:36 · 99 阅读 · 0 评论 -
CF773E Blog Post Rating(推导min的通项/线段树)
CF773E Blog Post Rating现在有一个值F,每次如果序列加入一个数后重新排列,每次如果F小于期望值,就会+1,如果等于就不变,如果大于就-1,求解每一次加入后F的最大值。这道题的确是非常的巧妙,尤其是对于答案的公式推导,显然如果只有一段可以看出是一个min的形式,但是当问题变为多段时就变得复杂,但是我们可以写出min形式的递推式,然后以此来得到通项式。...原创 2021-01-16 14:25:18 · 93 阅读 · 0 评论 -
CF436F Banners(分块/凸包/单调队列)
CF436F Banners首先有n个物品分别有ai和bi,然后定义价值为c∗w+p∗(ai大于p且bi小于c的用户个数)c*w+p*(ai大于p且bi小于c的用户个数)c∗w+p∗(ai大于p且bi小于c的用户个数)然后我们需要求解对于每一个c的最大价值和对应的p首先我们先枚举c,然后每次加入一个点相当于是每次给一个前缀加横坐标,然后询问最大值。因为每次加的大小是一定的,所以我们可以将其看作是一条直线,然后分块处理,每次对于完整的块就移动横坐标,维护单调队列,将横坐标小的弹掉,然后对于零散块直原创 2021-01-11 14:54:04 · 115 阅读 · 0 评论 -
数列分块入门
文章目录数列分块入门1数列分块入门2数列分块入门3数列分块入门4数列分块入门5数列分块入门6数列分块入门7数列分块入门8数列分块入门9数列分块入门1区间加,单点查询分块后,维护标记,零散块暴力加,查询时输出值加标记数列分块入门2区间加,询问区间小于等于k的元素个数每个区间维护排序数组,这样复杂度是根号带一个log,然后每次修改对于整块打标记,对于零散块直接暴力重构,注意暴力重构的时候不用管标记,因为标记相当于整体平移,和顺序无关。数列分块入门3区间加,询问区间k的前驱和2类似,我们还是维护原创 2021-01-10 15:37:48 · 208 阅读 · 0 评论 -
[2020多校A层12.3]虚构推理(语言/二分/数据结构)
[2020多校A层12.3]虚构推理给定n个时钟精确到秒,求解一个时间,使得它的指针和所有其他的时钟时针和分针分别的角度最大值最小。一道毒瘤的二分题,看到最大值最小,我们很容易想到二分答案。然后我们的关键是check,那么可以发现问题变成了扇形求解交集和补集的问题,然后我们可以联想到矩形求交的方法,但是这个问题中区域并不一定连续,所以我们必须要更一般的方法,那么我们可以利用数据结构比如线段树区间加,或者离线下来进行差分处理都可以,因为这是一维问题,不像矩形求交是二维的。然后得到时针的交和分针的交之后,原创 2020-12-03 21:00:40 · 62 阅读 · 0 评论 -
[2020多校A层12.1]树(倍增/单调栈/dfs栈)
[2020多校A层12.1]树求解树上从u到v的最长贪心上升序列,也就是只要有比它大的就选择它,可以发现这个问题性质,就是每个点对应了唯一的一个第一个比它大的点,那么我们可以向它们之间连边,然后问题就转化为求解从当前点上面的链中第一个大于c的位置和第一个深度小于dep[v]的位置。然后树上倍增维护即可。另外我们也可以用单调栈直接处理,将询问离线,然后维护当前点向根这条链的单调栈,然后二分对应位置即可。然后对于回溯需要存储下来弹掉的元素,然后回溯时要加回去。...原创 2020-12-01 19:24:56 · 91 阅读 · 0 评论 -
CF896E Welcome home, Chtholly(分块/并查集/第二分块)
CF896E Welcome home, Chtholly对于给定一个长度为n(n<=1e5)的序列,值域范围为1e5,要求支持两类操作。将区间[l,r]内所有大于x的数减x查询区间[l,r]内值为x的数的个数首先由于n和值域同阶,所以我们应该在值域上进行操作,但是这个东西不好用线段树的结构维护,因为它的修改比较独特,我们难以标记下传的方式处理。但是我们可以使用分块暴力处理,然后因为操作一的复杂度与值域有关,我们可以看出来,因为只有减操作,所以最大值一定是单调递减的,然后我们可以做到维护原创 2020-11-19 21:16:00 · 341 阅读 · 0 评论