
数据结构——线段树&树状数组
文章平均质量分 63
无
迷蒙之雨
这个作者很懒,什么都没留下…
展开
-
字符串刷题杂记
AC自动机CF710F String Set Queries洛谷题目传送门询问出现次数是AC自动机的拿手好戏,一个节点的出现次数是这个节点在失陪树上到根节点的路径上的出现次数总和但是AC自动机这种东西不支持凭空添加一个字符串如果可以离线就可以用CDQ分治搞定但是强制在线就有点困难有一个可以解决强制在线问题的分治算法,就是二进制分组我们分别维护大小为1,2,4,8,16……1,2,4,8,16……1,2,4,8,16……的ACACAC自动机加入一个串的时候,我们就先将它和大小为1的合并,重构原创 2022-02-17 16:24:43 · 216 阅读 · 0 评论 -
莫比乌斯反演专题(进阶篇)
51nod 1675 序列变换我们构造两个新的数列A,BA,BA,BAx=abx,Bx=baxA_x=a_{b_x},B_x=b_{a_x}Ax=abx,Bx=bax则题目给的条件等价于gcd(i,j)==1,Ai=Bjgcd(i,j)==1,A_i=B_jgcd(i,j)==1,Ai=Bj的i,ji,ji,j个数我们考虑设f(x)f(x)f(x)表示gcd(i,j)==x,Ai=Bjgcd(i,j)==x,A_i=B_jgcd(i,j)==x,Ai=Bj的i,ji,ji,j个原创 2022-01-25 10:41:35 · 434 阅读 · 0 评论 -
codeforces Forensic Examination(SAM+线段树合并)
洛谷题目传送门我们先对S和所有的询问串共同建立一个广义SAM并且在每个节点上维护一颗线段树代表这个节点代表的字串在各个串中出现次数也就是题目要求的,那么这个显然可以线段树合并维护出来然后询问的时候,我们要先在SAM上定位这个区间的字串,这个也很简单:每个子串可以看成一个前缀的后缀,而我们知道跳parent边就是不断取后缀的过程,所以我们先找到这个区间的前缀在SAM上的节点,然后跳parent边一直到合法,这个过程可以用书树上倍增加速然后我们在这个节点对应的线段树上查询题目给的区间内出现次数最多的串原创 2022-01-22 15:35:03 · 521 阅读 · 0 评论 -
[PKUWC2018]Minimax(整体DP+线段树合并+概率)
洛谷题目传送门题目说每一个权值的概率都不为0,所以每个权值都有可能取到考虑如下的dpdpdp:设fi,jf_{i,j}fi,j表示点iii取到jjj权值的概率,这里的权值可以离散化一下那么这个dpdpdp是怎么转移的?·如果这个点是叶子节点,那么只有一种取值是1,其余取值是0,·如果这个点只有一个儿子,那么整个dpdpdp数组都由那个儿子继承过来·如果这个点有两个儿子,设为x,yx,yx,y那么如果从左儿子转移则fi,j=fx,a×(pi×∑b=1a−1fy,b+(1−pi)×∑b=a原创 2021-12-29 10:17:16 · 403 阅读 · 0 评论 -
[CTSC2016]时空旅行(斜率优化+线段树分治)
洛谷题目传送门解题思路首先发现只有xxx和ccc是有用的这些时空构成了一棵树,我们实际上要找一个点iii,满足对于给出的XXXmin((X−xi)2+ci)min((X-x_i)^2+c_i)min((X−xi)2+ci)根据斜率优化的套路我们展开式子ans=(X−xi)2+ci=X2−2xiX+xi2+cians=(X-x_i)^2+c_i=X^2-2x_iX+x_i^2+c_ians=(X−xi)2+ci=X2−2xiX+xi2+cixi2+ci=ans+2∗xi∗X−X2原创 2021-12-16 13:17:07 · 595 阅读 · 0 评论 -
[FJOI2015]火星商店问题(线段树分治+可持久化01Trie)
洛谷题目传送门解题思路看到区间异或最大值,我们可以想到可持久化Trie树而看到动态的加入和删除,我们想到线段树分治因此把这两个结合起来就行了这个题和一般的线段树分治不太一样的的是,并不是物品有时间范围,而是查询有时间范围,我们知道最值问题是有可重叠性的,因此可以把每个询问的区间插入到时间线段树中,查询的时候我们可以先对物品按照商店编号排序,保证建立可持久化Trie树的时候更容易假设我们在线段树上遍历了某个区间,就把这个区间内的所有物品一起构建一颗可持久化0/1Trie,然后因为没有时间的限制,原创 2021-12-10 13:33:45 · 606 阅读 · 0 评论 -
字符串算法总结
(一) 后缀数组(SA)后缀数组是处理字符串的一大利器,常用倍增算法构造,一般情况下用到Height数组更常见重要性质1:两个后缀的最长公共前缀(记为lcp)为两个后缀在排名数组中两点间的Height值得最小值,常配合ST表或单调栈处理2:将后缀按照字典序排序后,第iii个后缀能贡献的本质不同子串个数为leni−Heightilen_i-Height_ileni−Heighti,且这些子串是按照字典序排序的因此可以得到一个字符串的本质不同子串个数为∑i=1nleni−Heighti\sum_{原创 2021-11-29 21:46:49 · 980 阅读 · 0 评论 -
[POI2011]ROT-Tree Rotations(线段树合并)
洛谷题目传送门解题思路事实上,我们只需要统计出每个点子树内的逆序对个数就行了,因为跨过子树的逆序对可以在LCA处统计,那么怎么统计呢?考虑线段树合并那么对于一段值域lll~rrr,我们只需要算出左子树的大于mid的数的个数乘以右子树小于mid的个数(这里的左右子树是指真实的树)...原创 2021-10-19 18:23:38 · 120 阅读 · 0 评论 -
NOIP复习计划(一)可持久化线段树(主席树)
为了迎接CSP/NOIP,我要开始复习NOIP的知识点不过有点手足无措,不知道从哪开始正好昨天讲了一道可以用主席树做的题,就来刷主席树的题这东西虽然联赛考的概率不大,但是如果遇到了一些其他问题我不会正解的,主席树可以代替一下,比如下面这道题[SHOI2007]园丁的烦恼题目传送门简化一下就是二维数点最经典的做法好像是扫描线,但是我不会所以就用CDQ分治或主席树写但是CDQ分治我不太会调,所以主席树是最好的选择[CTSC2018]混合果汁题目传送门题目要最大化果汁美味度的最小值,显然有原创 2021-10-04 21:52:48 · 125 阅读 · 0 评论 -
数据结构之树状数组(绝对让你理解清楚)
数据结构之树状数组目录数据结构之树状数组1:引子~~~假如现在需要你维护一种数据结构,需要能支持区间查询和单点更新,那么该怎么办?方法一:暴力枚举不用想,TLE妥妥的...原创 2020-08-08 13:59:24 · 1089 阅读 · 0 评论 -
P5163 WD与地图(可撤销并查集+整体二分+tarjan+线段树合并)
洛谷题目传送门题目描述CX 让 WD 研究的地图可以看做是 n 个点,m 条边的有向图,由于政府正在尝试优化人民生活,他们会废弃一些无用的道路来把省下的钱用于经济建设。城市都有各自的发达程度 si。为了方便管理,政府将整个地图划分为一些地区,两个点 u,v 在一个地区当且仅当u,v 可以互相到达。政府希望知道一些时刻某个地区的前 k 发达城市的发达程度总和,以此推断建设的情况。也就是说,共有三个操作:1 a b 表示政府废弃了从 a 连向 b 的边,保证这条边存在。2 a b 表示政府把钱用于建原创 2021-08-05 17:27:36 · 144 阅读 · 0 评论 -
CF786B Legacy(线段树优化建图)
洛谷题目传送门线段树优化建图模板题不会线段树优化建图的可以参考我的博客线段树优化建图按照题意在线段树上建图就行了,最后在跑一遍最短路#include<bits/stdc++.h>using namespace std;typedef long long LL; const LL N = 1e5+70;const LL M = 3e5+70;const LL K = 20;struct edge{ LL y,v,next;}e[N*K];struct node{原创 2021-07-28 14:53:37 · 96 阅读 · 0 评论 -
线段树优化建图
我们正常的图是一条一条边建出来的,不过如果现在有若干操作,形如把编号在(a,b)中的每一个点向编号在(c,d)的每一个点连一条边如果一个个的连,就会变成TLE自动机所以,一个神奇的操作就出现了,就是用线段树优化建图过程首先,我们需要有两颗线段树,一棵叫入树,一棵叫出树大概长这个样子其中黄色的边的边权为1假如我们现在要把编号在(1,2)中的点向(3,4)各连一条长度为v的边,那么流程如下首先在出树中找到对应(1,2)的区间,然后新建一个节点p,并从这个区间对应的节点向p连一条长度为0的边接原创 2021-07-28 14:50:07 · 273 阅读 · 0 评论 -
雨天的尾巴(线段树合并)
题目描述首先村落里的一共有 n 座房屋,并形成一个树状结构。然后救济粮分 m 次发放,每次选择两个房屋 (x, y),然后对于 x 到 y 的路径上(含 x 和 y)每座房子里发放一袋 z 类型的救济粮。然后深绘里想知道,当所有的救济粮发放完毕后,每座房子里存放的最多的是哪种救济粮。解题思路可以在每个节点用值域线段树维护最多的是那种救济粮,对于修改操作,可以运用树上差分的思想,在x和y增添一,在lca和lca的父亲处减掉一,最后查询时自底向上用线段树合并维护前缀和就可以了PS:还有一个小细节是题目原创 2021-07-20 07:20:26 · 228 阅读 · 0 评论 -
CF600E Lomsat gelral(线段树合并)
洛谷题目传送门有一棵 n 个结点的以 1 号结点为根的有根树每个结点都有一个颜色,颜色是以编号表示的, i 号结点的颜色编号为 ci如果一种颜色在以 x 为根的子树内出现次数最多,称其在以 x 为根的子树中占主导地位。显然,同一子树中可能有多种颜色占主导地位。你的任务是对于每一个i∈[1,n],求出以 i 为根的子树中,占主导地位的颜色的编号和。n≤1e5,ci≤n解题思路在每个点建立值域线段树,维护出现最多的颜色的次数和编号和,最后自底向上线段树合并就可以了#include<bit原创 2021-07-20 06:54:02 · 172 阅读 · 0 评论 -
[HNOI2012]永无乡(线段树合并)
在每个点建立值域线段树,连边时用并查集判断连通性,然后将两个连通块的祖先合并,最后查询时输出x所在连通块的祖先的信息就行了#include<bits/stdc++.h>using namespace std;const int N = 5e5+7;int fa[N],Rank[N],Island[N];int Find(int x){ if(x==fa[x]) return x; return fa[x]=Find(fa[x]);}int n,m,q;inline int原创 2021-07-20 06:48:46 · 173 阅读 · 0 评论 -
CF280D k-Maximum Subsequence Sum【线段树+费用流】
题目描述Consider integer sequence a1,a2,...,an. You should run queries of two types:The query format is "0ival". In reply to this query you should make the following assignment: ai=val. The query format is "1lrk". In reply to this query you...原创 2021-07-06 21:33:59 · 226 阅读 · 1 评论