![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
主席树
文章平均质量分 81
Frozen_Guardian
已退役菜鸡Acmer
展开
-
洛谷 - P3899 [湖南集训]谈笑风生(dfs序+主席树/二维数点)
题目链接:点击查看题目大意:设 TTT 为一棵有根树,我们做如下的定义:设 aaa 和 bbb 为 TTT 中的两个不同节点。如果 aaa 是 bbb 的祖先,那么称“aaa 比 bbb 更为厉害”。设 aaa 和 bbb 为 TTT 中的两个不同节点。如果 aaa 与 bbb 在树上的距离不超过某个给定常数 xxx,那么称“ aaa 与 bbb 彼此彼此”。给定一棵 nnn 个节点的有根树 TTT,节点的编号为 111 到 nnn,根节点为 111 号节点。你需要回答 qqq 个询问,询问给原创 2021-08-23 21:26:40 · 446 阅读 · 4 评论 -
2021HDU多校10 - 7084 Pty loves string(KMPnext树+主席树+dfs序)
题目链接:点击查看题目大意:给出一个长度为 nnn 的字符串 sss,需要回答 qqq 次询问,每次询问给出一对 (x,y)(x,y)(x,y) ,意思是用 sss 的前缀 s[1:x]s[1:x]s[1:x] 和后缀 s[n−y+1:n]s[n-y+1:n]s[n−y+1:n] 拼起来后得到一个新的字符串 ttt,问 ttt 在 sss 中的出现次数题目分析:考虑对于一对询问 (x,y)(x,y)(x,y) 得到的 ttt,存在 s[l:r]=ts[l:r]=ts[l:r]=t,设断点为 x′=l+x原创 2021-08-20 21:43:59 · 477 阅读 · 1 评论 -
2021牛客多校7 - xay loves trees(dfs序+主席树-标记永久化)
题目链接:点击查看题目大意:给出两棵以点 111 为根节点的有根树,现在要求满足条件的最大集合:在第一棵树中,集合内的任意两个点都必须满足祖先关系,即 uuu 是 vvv 的祖先或 vvv 是 uuu 的祖先,且集合内的点在第一棵树上是联通的在第二棵树上,任意两个点不能满足祖先关系题目分析:CodeForces - 1529E 的加强版,题面仅仅增加了在第一棵树中的点需要保证联通这一个条件写在前面,明明都发题解了,还疯狂交滑动窗口的 ** ,浪费评测机资源了属于是官方题解:需要注意的是:原创 2021-08-08 01:12:01 · 310 阅读 · 0 评论 -
2020-2021年度第二届全国大学生算法设计与编程挑战赛 (春季赛)- 天才的操作(线段树+主席树+树上倍增)
题目链接:点击查看题目分析:刚看到这个题目的时候,口胡了一个假算法,觉得对于每次询问的操作 [l,r][l,r][l,r] ,只需要找到指令集区间 [l,r][l,r][l,r] 内覆盖到点 kkk 的最大并集,然后求出这段区间中 aaa 数组的最大值就是答案了,这样一来直接用线段树维护一下数组 aaa,再用主席树维护一下区间交集即可但后来转念一想,覆盖的区间还有时序问题,也就是两个区间执行的先后顺序不同,会造成不一样的结果,到此为止这个题也就卡住了今天看了题解和杨大佬讨论了一下就豁然开朗了,其实卡.原创 2021-06-07 18:43:09 · 516 阅读 · 2 评论 -
AC自动机解决字符集很大的情况(可持久化数组优化getfail的过程)
今天遇到了一个问题,那就是如果 ACACAC 自动机的字符集很大该怎么办?比如改成 1e51e51e5 该怎么办呢?例如下题:题目来源转自(侵权删):点击查看先不考虑解法,肯定是需要用 ACACAC 自动机去解决的,但是问题是,本题中字符串的总长度可能达到 O(n2)O(n^2)O(n2) 级别,加上字符集特别大,所以遇到了很多问题不过不难看出题目中给出的实际上就是一棵 trietrietrie 树,我们可以直接在 trietrietrie 树上 getfailgetfailgetfail,就可以原创 2021-06-03 17:08:00 · 674 阅读 · 3 评论 -
牛客 - Elo mountains(AC自动机+可持久化数组优化)
题目链接:点击查看题目分析:初始时给出一棵以点 000 为根节点的字典树,设 arriarr_iarri 为从根节点出发到达点 iii 的字符串,需要回答对于每个 i∈[1,n]i\in[1,n]i∈[1,n] 时的 ∑k=1nf(arri,arrk)\sum_{k=1}^{n}f(arr_i,arr_k)∑k=1nf(arri,arrk),其中 f(s,t)f(s,t)f(s,t) 代表的是字符串 sss 在字符串 ttt 中出现的次数题目分析:先附上官方题解:本题难点及解决方法:字原创 2021-06-03 17:41:49 · 447 阅读 · 4 评论 -
CodeForces - 916D Jamie and To-do List(主席树+模拟)
题目链接:点击查看题目大意:模拟实现 nnn 次操作,每次操作共有四种类型:set ai xiset \ a_i \ x_iset ai xi:设置 aia_iai 的优先级为 xix_ixiremove airemove \ a_iremove ai:删除 aia_iaiquery aiquery \ a_iquery ai:查询有多少个事情的优先级小于 aia_iai 的优先级,如果 aia_iai原创 2020-12-21 22:37:04 · 199 阅读 · 0 评论 -
CodeForces - 484E Sign on Fence(主席树区间合并+二分)
题目链接:点击查看题目大意:给出一个长度为 nnn 的数列,需要回答 mmm 次询问,每次询问的格式如下:l r kl\ r\ kl r k,需要回答区间 [l,r][l,r][l,r] 内,所有长度为 kkk 的子区间中,最小值的最大值是多少,即在 [l,r][l,r][l,r] 中选择一段长度为 kkk 的子区间,使得其最小值最大题目分析:求最小值的最大值不难想到二分,所以现在问题转换为了对于询问l r kl\ r\ kl r&n原创 2020-12-21 17:46:21 · 187 阅读 · 0 评论 -
CodeForces - 813E Army Creation(主席树+思维)
题目链接:点击查看题目大意:给出一个长度为 nnn 的数列和一个整数 kkk,现在有 qqq 次询问,每次询问给出一个区间 [l,r][l,r][l,r],设 cnticnt_icnti 为数字 iii 在区间内出现的次数,需要输出 ∑min(cnti,k)\sum min(cnt_i,k)∑min(cnti,k),其中 iii 是区间内所有出现过的数字,所有询问强制在线题目分析:看到强制在线加上区间问题不难想到主席树,有个思维点必须要想到才行,一开始我想的是对于每个种类的数字维护一个前缀和,然后对原创 2020-12-20 22:00:16 · 278 阅读 · 2 评论 -
牛客 - 牛半仙的妹子图(并查集+bitset/克鲁斯卡尔重构树+主席树)
题目链接:点击查看题目大意:给出一个由 n 个点和 m 条边组成的连通图,每个点都有一种颜色,每条边都有一个权值,现在规定一个起点 st,再给出 q 次询问,每次询问给出区间 [ l , r ] ,问权值为i ∈ [ l , r ] 时,从起点经过权值不超过 i 的连通块内,有多少种不同的颜色题目分析:因为需要回答的答案满足前缀和的性质,所以可以预处理出前缀和然后 O( 1 ) 回答,但是询问的范围特别大, 需要对前缀和进行离散化,这个应该算是一个小技巧,具体实现可以参考代码然后就是颜色的...原创 2020-10-28 20:08:38 · 304 阅读 · 2 评论 -
牛客 - 红蓝图(克鲁斯卡尔重构树的dfs序上建主席树)
题目链接:点击查看题目大意:给出一张 n 个点和 m 条边组成的无向图,每条边都有边权和颜色,颜色分为红色和蓝色,现在有 q 次相互独立的操作,每次操作会询问 ( x , t ) ,问删除掉所有权值大于 t 的红色边和所有权值小于 t 的蓝色边后,x 所在的连通块的大小是多少注意,两个点联通,既需要存在着红色的可达路径,也需要存在着蓝色的可达路径题目分析:如果去掉蓝色边的限制,只考虑 “删除掉权值大于 t 的边后,点 x 所在的连通块的大小是多少” ,这就是个标准的克鲁斯卡尔重构树的dfs序问题原创 2020-10-16 11:38:48 · 358 阅读 · 0 评论 -
HDU - 4348 To the moon(主席树区间更新-标记永久化)
题目链接:点击查看题目大意:给出一个初始时长度为 n 的序列,有 m 次操作,每种操作分为下列四种类型:C l r d:新建一个继承了前一个版本的数组,并将区间 [ l , r ] 内的数字都加上 d Q l r:访问最后一个版本的数组,[ l , r ] 内的区间和 H l r t:访问第 t 个版本的数组,[ l , r ] 内的区间和 B t:回溯到第 t 个版本题目分析:如果不考虑变量 t ,也就是不同版本的数组所带来的影响,那么这就是线段树的一道经典区间修改和区间查询的题目,写一个原创 2020-10-15 10:31:50 · 344 阅读 · 0 评论 -
洛谷 - P2617 Dynamic Rankings(树状数组套主席树)
题目链接:点击查看题目大意:给出一个长度为 n 的数列 a,再给出 m 次操作:Q l r k:返回区间 [ l , r ] 内第 k 大的数 C x y:令a[ x ] = y题目分析:其实就是带修主席树。。考虑静态主席树,维护的是一个线段树的前缀和,如果强行修改的话,修改一次最坏的时间复杂度将高达 nlogn,完成 m 次操作后的时间复杂度为 nmlogn,还不如直接暴力去区间里找呢。。直接暴力的话时间复杂度也才 n * m所以为了尽可能去平衡查询和修改的时间复杂度,考虑用树状数组维护.原创 2020-10-14 21:11:25 · 250 阅读 · 0 评论 -
中石油训练赛 - Russian Dolls on the Christmas Tree(树上启发式合并/主席树)
题目链接:点击查看题目大意:给出一棵 n 个节点的树,以点 1 为根,现在对于每个节点作为根的子树求解:子树中有多少个编号不相交的连续子段,如:1 2 4 5 7,共有三个连续的段,分别为 [ 1 , 2 ] , [ 4 , 5 ] , [ 7 ]题目分析:树上启发式合并的模板题,cal 函数中直接维护一个数组用来统计加入或删除掉一个数字后对于贡献的影响即可:如果编号 x - 1 和 x + 1 早已存在,那么加入 x 后总段数减一 如果编号 x - 1 或 x + 1 早已存在,那么加入..原创 2020-10-12 17:56:08 · 526 阅读 · 0 评论 -
CodeForces - 1422F Boring Queries(主席树+线段树/RMQ)
题目链接:点击查看题目大意:给出 n 个数组成的数组 a ,再给出 m 次询问,每次询问需要回答区间 [ l , r ] 中所有元素的最小公倍数,强制在线题目分析:首先考虑多个数的最小公倍数该如何求,因为每个质因子对于最小公倍数的贡献都是相互独立的,所以对于某个质因子 p 来说,可以求出其在所有数字中出现的次数记为 b[ 1 ] , b[ 2 ] ... b[ n ] ,那么质因子 p 对于最小公倍数的贡献就是,对于所有质因子的贡献求乘积就是所求的最小公倍数了因为每个元素只有 2e5 这么大,.原创 2020-10-06 19:15:07 · 626 阅读 · 0 评论 -
牛客 - 牛牛的mex(主席树/思维)
题目链接:点击查看题目大意:给出一个长度为 n 的排列,再给出 m 次询问,每次询问需要回答区间 [ l , r ] 的 mex题目分析:算是一道比较经典的题目了吧,先说一般做法,一般做法是 nlogn 的主席树,或者离线线段树,或者是 nsqrt( n ) 的莫队,这里我选择了比较好理解的主席树存一下,主席树的话就是每一个版本的线段树储存一下 [ 1 , i ] 中每个数字最后一次出现的位置,这样每次查询 [ l , r ] ,只需要在第 r 个版本的线段树中查询最小的那个没有出现的数字即可而原创 2020-08-29 20:49:26 · 440 阅读 · 0 评论 -
牛客多校5 - Interval(主席树)
题目链接:点击查看题目大意:给出一个长度为 n 的数列 a ,规定函数 f( l , r ) = a[ l ] & a[ l + 1 ] & ... & a[ r ] ,在规定sets( l , r ) = { f( a , b ) | l <= a <= b <= r } ,对于 q 次询问,每次询问回答 s( l , r )题目分析:根据位运算的性质,可以知道每一位都是相互独立的,再根据与运算的性质,可以知道,当左端点或者右端点的其中一个端点在固定之后.原创 2020-08-25 15:49:21 · 247 阅读 · 0 评论 -
洛谷 - P4755 Beautiful Pair(笛卡尔树+主席树)
题目链接:点击查看题目大意:给出一个长度为 n 的数列 a,现在一个数对 ( i , j ) 如果满足 a[ i ] * a[ j] <=max( a[ i ] ~ a[ j ]),则称其为美丽的,求出美丽对的数量题目分析:直接统计是比较困难的,但正难则反,我们可以枚举每个数作为最大值时,在其管辖的区间内进行统计,对于某个最大值 i 来说,肯定存在着 l[ i ] 和 r[ i ] ,使得 l[ i ] - 1 是 a[ i ] 左侧首个大于 a[ i ] 的位置,r[ i ] + 1 是..原创 2020-08-24 11:12:45 · 288 阅读 · 0 评论 -
洛谷 - P4197 Peaks(Kruskal重构树+dfs序+主席树)
题目链接:点击查看题目大意:有n座山峰,每座山峰有他的高度 h[ i ] ,有些山峰之间有双向道路相连,共m条路径,每条路径有一个困难值,这个值越大表示越难走。现在有q组询问,每组询问询问从点v开始只经过困难值小于等于x的路径所能到达的山峰中第k高的山峰,如果无解输出−1。题目分析:因为有困难值的限制,所以可以对整个图跑克鲁斯卡尔重构树,如果对点 v 来说,只能走小于等于 x 的路径,可以树上倍增找到权值小于等于 x 的,深度最浅的祖先,显然这个祖先子树中的所有点都是可...原创 2020-08-23 19:35:55 · 374 阅读 · 0 评论 -
HDU - 4417 Super Mario(主席树/线段树+离线)
题目链接:点击查看题目大意:给出由 n 个数的数列,再给出 m 次查询,每次查询需要输出 [ l , r ] 内小于等于 h 的数有多少个题目分析:大晚上睡不着觉随便做做题,发现这个题目原来可以用主席树来做,又发现这个题目去年暑假竟然没写博客,于是补上一发线段树离线的做法就是对数列和询问的高度排序,遍历每个询问,双指针将小于等于当前询问高度的位置都扔到线段树中,记录当前询问的区间内有多少个数即可主席树在线做法,有两种,先说一下网上最常见的,就是遍历每个位置作为下标,对于下标维护可持久化线段树原创 2020-08-08 03:12:31 · 256 阅读 · 0 评论 -
HDU - 5919 Sequence II(主席树+思维)
题目链接:点击查看题目大意:给出 n 个原创 2020-06-27 23:46:24 · 294 阅读 · 0 评论 -
HDU - 6601 Keen On Everything But Triangle(主席树)
题目链接:点击查看题目大意:给出一个长度为 n 的数列 a ,再给出 q 次询问,每次询问给出一个区间 [ l , r ] ,要求从区间内选出三个数,使得构成的三角形周长最大,如果无解输出 - 1题目分析:如果将区间 [ l , r ] 内的数列排个序的话,肯定从大到小找连续相邻的三个数是最优的,这样一来,我们必须找到相邻的 x , y , k,满足 a[ x ] + a[ y ] > a[ k ] ,那么我们反过来想,如果不满足条件的话,即恰好有 a[ x] + a[ y ] = a[ k.原创 2020-06-23 01:45:04 · 268 阅读 · 0 评论 -
HDU - 5820 Lights(主席树)
题目链接:点击查看题目大意:给出一个 n * m 的矩阵,再给出 N 个点,问其中的任意两个点 ( x1 , y1 ) 与 ( x2 , y2 ) 之间,最短路径为 abs( x1 - x2 ) + abs( y1 - y2 ) ,是否存在一条最短路径,使得拐弯的地方都存在着点题目分析:正难则反,我们可以选定一个矩形区域作为非法区域,若非法区域内存在点的话,那么答案显然就是 NO 了这样的话必须要正着扫一遍,再倒着扫一遍,不然没法同时解决以下两个样例:input:21 3.原创 2020-06-23 00:15:28 · 295 阅读 · 0 评论 -
HDU - 5790 Prefix(主席树+字典树)
题目链接:点击查看题目大意:给出 n 个字符串,再给出 m 次询问,每次询问需要输出区间[ l , r ] 内的所有字符串有多少个不同的前缀,要求算法强制在线题目分析:统计字符串的前缀,不难想到借助字典树实现,再将问题简化为在线求区间 [ l , r ] 内不同数字的个数,这就是主席树的基本应用了,两个模板搭配起来就是这个问题的答案了代码:#include<iostream>#include<cstdio>#include<string>#i..原创 2020-06-20 03:31:17 · 298 阅读 · 0 评论 -
SPOJ - DQUERY D-query(莫队/线段树+离线/主席树)
题目链接:点击查看题目大意:给出一个由n个数组成的序列,再给出m次查询,每次查询区间[l,r]中有多少个不同的数题目分析:莫队模板题,直接套板子就好了有点意思的是函数返回值为布尔类型,然后没有return的话就会RE,神仙评测机或者也可以用线段树离线做,按照区间右端点排序,每次维护一下某个数值最后一次出现的位置,实时更新其最后出现的位置,保证某个数值在线段树中只出现一次即可代码...原创 2019-11-27 02:21:58 · 313 阅读 · 0 评论 -
HDU - 4866 Shooting(主席树+扫描线)
题目链接:点击查看题目大意:给出 n 条平行于 x 轴的线段,每条线段都的 [ l , r ] 都位于 [ 1 , X ] 之间,每条线段的高度为 d,也就是距离 x 轴的位置,接下来给出 m 次询问,每次询问给出一个 x 和 k ,问:在点 x 处向上的前 k 个线段的高度之和为多少,如果 k 大于点 x 处的线段总数,那么缺少的线段用最高的线段的高度补上题目分析:因为题目要求了强制在线,所以不能用线段树+离线来完成,区间 [ 1 , X ] 上的每个点可以通过扫描线的思想,将 n 条线段的属性转原创 2020-06-20 02:07:17 · 283 阅读 · 0 评论 -
HDU - 5788 Level Up(主席树+dfs序+树状数组)
题目链接:点击查看题目大意:给出一棵有向树,每个节点都有一个初始的权值 a[ i ] ,和一个通过计算得到的权值 mid[ i ] ,mid 数组的计算方法如下:mid[ u ] 为结点 u 及其子树中所有a[ i ] 的中位数,现在问如果可以令其中一个节点的 a[ i ] 变为 1e5,如何选择可以使得所有节点的 mid[ i ] 之和最大题目分析:乍一看题目可能比较复杂,但是一步一步分析下来可能就能找到突破口了首先是子树,对于子树上进行操作,我们可以跑出整棵树的dfs序,这样就将子树上的操.原创 2020-06-19 01:55:48 · 310 阅读 · 0 评论 -
HDU - 3804 Query on a tree(主席树维护最大值+离散化)
题目链接:点击查看题目大意:给出一棵树,每条边上都有一个权值,给出m个查询:a,b:问从点1到点a的唯一路径上,在边权小于等于b的边中选出边权最大的值输出,若没有符合条件的边则输出-1;题目分析:时隔三个月再次重温这个题目,感觉这个题目真的就简单多了,直接剖完然后离线线段树做就行了,所以为了挑战一下自己,我选择用主席树写了一发,不得不说,这个题目内存卡的真死,权值的数据给到了1e9,本来想...原创 2019-11-11 00:32:17 · 427 阅读 · 0 评论 -
SPOJ - COT Count on a tree(LCA+主席树+离散化)
题目链接:点击查看题目大意:给出一棵树,每个点都有一个权值,现在给出m个询问,每次询问的格式是u,v,k,要求输出u-v这条路径上第k大的数题目分析:一看到第k大的数就会想到主席树,既然是在树上的操作,我们就需要用lca先把u-v这条路拿出来,具体的还是用树上倍增来实现,然后在dfs的过程中建立一棵可持久化的线段树,也就是主席树,在查询的时候就可以直接对于u-lca-v这条路上直接查询了,...原创 2019-11-08 02:11:35 · 327 阅读 · 0 评论 -
计蒜客 - Distance on the tree(LCA+主席树)
题目链接:点击查看题目大意:给出一颗含有n个节点的树,每条边都有权值,现在给出m个询问,每次询问的格式为u,v,w,我们需要求出在路径u-v上,边权小于等于w的边的个数题目分析:多的不说了,上一个博客都写的差不多了,这次来挂一发主席树+LCA的代码,LCA我觉得树上倍增的好写,反正写起来不容易错,然后前两天学会了可持久化字典树之后,再回头看主席树也觉得简简单单了对了,注意一下主席树的大...原创 2019-11-08 00:50:02 · 186 阅读 · 0 评论 -
POJ - 2104 K-th Number(主席树)
题目链接:点击查看题目大意:给出一个数列,然后是m次查询,每次查询闭区间[l,r]内第K大的数题目分析:裸的主席树,暑假集训第三周的时候就听说过了这个数据结构,不过当时太懒了,而且那些主席树的问题都能用线段树离线处理,就没花功夫来学,今天遇到的这个题,本来也想用线段树离线处理,但是发现用vector会超时,看网上的题解是要用二分优化,但我不太理解为什么要那样二分,所以就来学一学这个高级数据...原创 2019-08-26 10:14:19 · 269 阅读 · 0 评论