![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
主席树
文章平均质量分 67
逍遥Fau
为伊蕾娜献上心脏!
展开
-
P4175 [CTSC2008]网络管理 (动态树上第k大)
题目链接: P4175 [CTSC2008]网络管理大致题意给定一棵有nnn个节点的树, 节点上有权值wiw_iwi. 有mmm次操作.0 a b 表示把节点aaa的权值修改为bbb. 即: wa=bw_a = bwa=bk a b 查询(a,b)(a, b)(a,b)最短路径上, 第kkk大的值.解题思路➡️静态树上第kkk小⬅️点这里如果没有做过这个题的静态版本, ⬆️推荐博客⬆️. 下文讲解也会基于上述博客.很多静态树上第kkk小的做法也都适用于本题, 可以参考上述博客, 本文只原创 2021-11-20 18:38:13 · 380 阅读 · 0 评论 -
SPOJ-COT Count on a tree (静态树上第k小) 精讲
题目链接: Count on a tree大致题意给定一棵有nnn个节点的树, 节点上有权值wiw_iwi. 有mmm次询问, 每次询问(a,b)(a, b)(a,b)最短路径上, 第kkk小的权值是多少.解题思路思路一: 树链剖分 + 主席树 + 树外二分/树内二分 复杂度: O(mlog3n)O(mlog^3n)O(mlog3n) / O(mlog2n)O(mlog^2n)O(mlog2n)这是一个静态树上路径求第kkk小的问题, 如果是在序列上, 我们不难想到用主席树可以做到O(logn原创 2021-11-20 14:13:13 · 667 阅读 · 0 评论 -
P4137 Rmq Problem / mex (三种解法: 权值线段树+询问离线 / 可持久化线段树 / 莫队+值域分块)
题目链接: P4137 Rmq Problem / mex大致题意给定一个长度为nnn的序列, 有mmm次询问操作.每次询问[l,r][l, r][l,r]区间的mexmexmex是多少.解题思路解法一: 权值线段树 + 询问离线我们考虑把所有的询问按照右端点rrr从小到大排序, 用权值线段树维护[1,r][1, r][1,r]区间中所有数值最后一次出现位置的最小值.对于询问区间[l,r][l, r][l,r], 我们在树上进行二分, 如果当前值域左区间的最小出现位置要小于lll, 则访问左区原创 2021-11-11 19:03:14 · 471 阅读 · 1 评论 -
HDU5790 Prefix (主席树 + 单词Trie)
题目链接: Prefix大致题意给出n个字符串, 编号从1~n.每次询问编号在[l, r]区间的所有字符串中, 不同前缀的数目. (强制在线)解题思路思维首先考虑到字符串的总长度为1E5, 因此不同前缀的数量最多为1E5.如果不加以区间的限制, 询问所有的字符串有多少不同的前缀. 则我们可以通过Trie来完成. 我们把字符串插入Trie中, 如果此时我们为当前字符开辟了新节点, 则不同前缀数目+1.考虑区间限制, 如果我们把不同的前缀 修改为 不同的数字(即: 询问[l, r]区间不同数字的原创 2021-08-05 20:11:33 · 63 阅读 · 0 评论 -
Dynamic Rankings (动态主席树 / 整体二分)
题目链接: Dynamic Rankings2021.6.8 更新了区间线段树套权值线段树的解题方式, 并翻新了博客大致题意带修改的第k小数模板题.解题思路动态主席树 和 整体二分 的模板题!思路一: 树状数组 + 主席树考虑到通常的静态第k小数, 我们可以用主席树在O(mlogn)的优秀时间复杂度内求出结果. 其主体思路是在权值线段树上进行树上二分.现在考虑到有了单点修改操作, 我们如果直接在常规的主席树上进行修改, 当你修改pos位置时, 我们需要把[pos, n]区间的所有版本主席树原创 2021-06-08 11:22:40 · 491 阅读 · 1 评论 -
速度即转发 (整体二分 / 动态主席树)
题目链接: 速度即转发大致题意略解题思路整体二分 / 动态主席树考虑到对于s(x)函数, 其实是满足二分性质的. 所以我们可以考虑二分求解.我们发现我们需要维护的是, 对于每一次二分的答案mid, 我们需要知道有多少个数字比mid大, 以及他们的总和是多少. 我们可以用权值线段树 或者 两个树状数组来维护信息.整体二分做法我们直接二分值域, 每次假设mid为询问答案, 统计大于mid的位置信息, 然后判断是否满足要求即可.若满足要求, 则右区间去寻找. 反之去左区间寻找答案. 需要注意的原创 2021-05-12 22:33:49 · 79 阅读 · 0 评论 -
HDU3333 Turing Tree (离线查询 + 线段树/树状数组 or 主席树)
题目链接: Turing Tree大致题意有一个长度为n的序列, 从1~n编号, 每个位置都有一个元素值.询问: 多次查询, 每次查询[l, r]中去重后的元素总和.解题思路离线查询 + 线段树/ 树状数组 or 主席树相思题目推荐解法一: 主席树主席树的思路其实比较好想. 这个题的问题本质是, 询问每段区间, 求不重复的元素的总和. 那么我们按照每一个位置, 都去建立一棵线段树, 树中维护[1, index]位置不重复元素之和.当加到第index个位置时, 有两种情况: ①该数字在之原创 2021-05-11 13:23:03 · 270 阅读 · 0 评论 -
HH的项链 (三种解法) (离线查询 + 线段树/树状数组 or 主席树)
题目链接: HH的项链大致题意解题思路离线查询 + 线段树/ 树状数组 or 主席树解法一: 主席树主席树的思路其实比较好想. 这个题的问题本质是, 询问每段区间, 看看有多少个不重复的数字. 那么我们按照每一个位置, 都去建立一棵线段树, 树中维护[1, index]位置有多少个不重复元素.当加到第index个位置时, 有两种情况: ①该数字在之前没有出现过 ②该数字在之前出现在pos位置过(pos < index). (关于位置pos的维护, 我们可以采用哈希表)对于情况①, 我原创 2021-05-11 12:46:07 · 2196 阅读 · 5 评论 -
P3168 任务查询系统(主席树 + 扫描线)
题目链接: 任务查询系统大致题意…解题思路这里放一道类似的题目. Shooting主席树 + 扫描线这里先说一下主席树 + 扫描线的用法.我们把题目中给定的三元组假想成, 在坐标轴x轴上方, 有一条线段平行于x轴, 位于[l, r], 距x轴的距离为c. 那么题目中相当于每次询问出一个pos, 表示当前位于pos处, 问你当前位置上方距离x轴最近的k条线段的总距离和是多少.对于这种模型, 我们就可以采用如下方法: 将每条线段用差分的思路拆分成点的形式, 并且以x轴上的每个坐标值(1, 2,原创 2021-05-03 16:26:12 · 120 阅读 · 0 评论 -
HDU4348 To the moon(主席树)
题目链接: To the moon大致题意给你一串序列,每次对它有四种操作,1.C l r d:将l到r之间所有的数+d,同时时间戳+1。2.Q l r:查询当前时间戳下l到r的所有数的总和。3.H l r t:.查询时间戳t下的l到r的所有数的和。4.B t:将时间戳返回至t。解题思路主席树这道题和许多的主席树题目不太一样, 这道题的思想是用主席树维护区间和问题, 而不是维护多棵权值线段树问题.思路: 可以一开始把数组变成前缀和数组, 这样可以省去建初始树的操作. 随后就是线段树的区间原创 2021-04-30 12:06:52 · 170 阅读 · 0 评论 -
Jewel (主席树 / 整体二分)
题目链接: Jewel大致题意给定n个操作, 操作有如下四种:Insert X:插入x到序列末尾query1 L R X:在当前序列中的[l,r]区间找第x小的数query2 X:在当前序列中,输出X是第几小的数query3 X:找到当前序列中第X小的数是几。 然后输出的是3种query的和解题思路整体二分或主席树主席树做法需要将值域离散化, 然后进行正常的主席树查询操作即可.整体二分做法需要把操作离线, 然后二分求解即可.这个题主席树跑的很快, QAQ.AC代码#includ原创 2021-04-30 09:06:46 · 132 阅读 · 0 评论 -
hdu4417 Super Mario(主席树)
题目链接: Super Mario大致题意给你一个序列, 从0 ~ n - 1编号, 每次询问给出l, r, h, 表示询问[l, r]有多少个数≤h.解题思路主席树. 相当于是询问一个区间中h是第几小的数字. 模板题AC代码#include <bits/stdc++.h>#define rep(i, n) for (int i = 1; i <= (n); ++i)#define debug(a) cout << #a << " = " <&原创 2021-04-29 21:04:13 · 143 阅读 · 0 评论 -
P2617 Dynamic Rankings(动态主席树 / 整体二分)
题目链接: Dynamic Rankings大致题意有眼就行解题思路动态主席树 和 整体二分 的模板题!关于主席树的解法, 因为有单点修改, 所以我们要采用动态主席树. 具体方法就是, 把主席树中的存储方式采用树状数组的存储方式.因此查询的时候, 原本是传入一个l - 1版本和一个当前版本r, 但是由于采用了树状数组的存储方式, 就要传入logn个版本. 修改同理.整体二分不得不说, 这题整体二分跑的是真的快!AC代码主席树//例题: 求动态区间第K小数 (静态树 + 动态树做法)/原创 2021-04-29 20:54:45 · 162 阅读 · 0 评论 -
K-th Closest Distance (主席树)
题目链接: K-th Closest Distance大致题意给定一个长度为n序列, 有m次询问. 每次询问给出l, r, p 和 k. 表示询问序列[l, r]区间中和p的绝对值之差第k小的数字.解题思路主席树, 这不还是求一个区间第k小的问题, 所以首先我们应该想到用主席树来维护.考虑到询问, 每次要求与p绝对值之差第k小, 因此我们不妨二分, 对于当前mid, 我们统计有多少个数的值位于[p - mid, p + mid]区间.AC代码#include <bits/stdc++.h原创 2021-04-28 20:40:39 · 118 阅读 · 0 评论 -
Codeforces484E Sign on Fence(线段树 + 整体二分 / 静态主席树)
题目链接:Sign on Fence大致题意给定一个长度为n的序列, 有m次询问操作. l r d 表示询问最大的在区间[l, r]中长度为d的序列中的最小数.解题思路思路一: 线段树 + 整体二分首先询问的答案可离线, 且满足二分的性质. 不妨我们先考虑整体二分值域. 每次以mid作为当前的答案, 那么我们需要知道是否在区间[l, r]内有连续的, 且长度为L(L>=d)的连续位置的值都>mid.这个操作很容易想到我们可以用线段树来维护, 枚举答案区间的数字, 判断其是否>原创 2021-01-17 19:52:59 · 276 阅读 · 1 评论 -
codeforces1514D Cut and Stick (主席树)
题目链接: Cut and Stick大致题意有一个下标从1~n的序列, 每次给出一组询问 l, r, 而你要把[l, r]区间拆成尽可能少的组, 使得每组内统一元素出现次数不超过⌈组长 / 2⌉.解题思路这个题其实分析下来, 就是要找这个区间内出现次数最多的元素出现了多少次. 如果这个次数<=⌈区间长度 / 2⌉, 则无意义, 反之我们需要将当前区间进行拆分.我们可以通过主席树来实现寻找元素出现次数的操作.相当于在权值线段树上找一个元素, 其出现次数 >= ⌈区间长度 / 2⌉,原创 2021-04-21 22:54:39 · 543 阅读 · 1 评论 -
codeforces840D Destiny (主席树求区间>=num的最小值)
题目链接: Destiny大致题意有一个下标从1~n的序列, 每次给出一组询问 l, r, k. 询问在[l, r]区间, 是否有元素出现次数 > (r - l + 1) / k. 如果存在的话, 输出最小的元素, 反之输出-1.解题思路我们可以通过主席树来实现.具体做法是, 在权值线段树上每次比较左半区间和右半区间的元素个数之和是否满足条件, 若满足则进行递归求解.考虑到复杂度问题, 如果假设k == 2的情况, 我们很容易观测到, 左半区间和右半区间只会满足一个, 不可能同时满足. 因原创 2021-04-21 20:29:34 · 260 阅读 · 0 评论 -
M. Stone Games(主席树) ICPC 昆明站
题目链接: Stone Games大致题意有n堆石子, 从1~n标号, 每堆石子有ai个.每次询问给出一个区间 [l, r], 表示你可以选择的石子堆编号. 每次你可以选择一个子集. 子集内的石子总数加和即为所得.问: 不能凑出的最小正整数是多少.解题思路大概分析个人感觉, 这个题的难点主要还是在思维方面, 代码难度不高.题目中的询问相当于是MEX询问, MEX是对于自然数集的询问, 而当我们一堆石子都不选的时候, 相当于就凑出了0, 即: 0是总能被满足的.那么我们其实很容易发现, 如果原创 2021-04-09 15:32:32 · 348 阅读 · 0 评论