
主席树
lushanlushan0026
退役acmer,准研究生
展开
-
牛客多校 Interval 主席树套路
题意就不说了这样的题乍一看感觉区间& 会有n^2级别个不同的数 其实仔细分析是没有那么多的我们考虑维护一个map 这个map记录了当前位置以前的数&起来后可以得到的值以及他们的位置 (是连续的 可以理解为后缀&) 那么我们加入当前位置的数 并且与map中的值进行&操作(这一步我们最多得到logn个值)然后就是一个主席树的套路了 对于在前面出现过的值 我们把它的位置-1 并且在当前位置+1 然后更新这个值的位置为当前位置 这个题可以算是区...原创 2020-08-01 10:34:47 · 191 阅读 · 0 评论 -
P5385 [Cnoi2019]须臾幻境 LCT+主席树 维护区间联通块个数
题意很简单:给n个条边 m条边 每一次给一个询问 l,r 问区间l~r的边构成的图的联通块个数因为是不断加边 所以我们的lct肯定是维护边的 然后我们思考边和联通块的关系 一开始整个图是n个孤立的点 联通块的数目为n 当我们加入第一条边的时候 联通块数目-1 规律大概是 联通块数=n-边数 但是在构成环的时候就不成立了 例如 图中有 u,v 这样的一条链 u~v的点都是属于一个联通块 那么我如果加入一条边 使得u连上v 那么对联通块的减少是没有贡...原创 2020-07-16 09:47:13 · 473 阅读 · 0 评论 -
P2839 [国家集训队]middle 主席树+求中位数技巧
首先做这个题 我们要用到一个常用的技巧 二分求中位数具体步骤就是 先二分一个值 在数组中把大于等于这个值的数都设为1 把小于这个值的数都设为-1如果数组和>=0 那么 l=mid+1否则的话 r=mid-1那么我们如何快速的进行这个操作呢 假如一个询问是 a,b,c,d a<b<c<d 并且对于 区间a~d我们都进行了上述的赋值操作那么 b+1~c-1之间的值是肯定要算进去的 然后我们需要在 a~b区间内找个最大后缀和...原创 2020-07-15 17:25:36 · 264 阅读 · 0 评论 -
P4592 [TJOI2018]异或 树上可持久化trie
树上可持久化trie的板子 第一棵树按照dfs序建立 第二棵树按照遍历顺序直接在父节点的基础上建立空间开N*50 开个N*30wa了 也不re de了半天bug#include<bits/stdc++.h>#define R register intusing namespace std;const int N = 1e5+100;int h[N],to[N<<1],nex[N<<1],cur,val[N],lg[N],fa[N][30],dep...原创 2020-06-12 11:01:44 · 163 阅读 · 0 评论 -
P5787 二分图 /线段树分治 或 lct
没有奇环的图就是二分图,所以我们要想办法去维护一个图里面有没有二分图。线段树分治的做法:以时间建立线段树,对于每一条边的出现与消失时间,我们通过区间更新把这条边挂在线段树的结点上,最后对线段树进行一次遍历。搜索的时候加边,回溯撤销边。用扩展域并查集判断是否为二分图,因为要撤销边,所以并查集得是可撤销的,并且不能路径压缩,同时为了保证复杂度必须按秩合并。并查集判断二分图的方法是 对于每一条加入的边 (u,v) 如果u,v已经联通 那么不是二分图,否则合并(u,v+n),(v,u+n)整个复杂度 .原创 2020-06-11 09:01:47 · 210 阅读 · 0 评论 -
P2633 Count on a tree 主席树求树上第k大
看到树上第k大 首先想想普通的前缀和怎么做 假如我要静态的求链(u,v)的和 那么我们就从树根一直搜下来 维护一个前缀和,答案就是现在再来看主席树的方法就一目了然啦 对于每一个结点 在父节点的基础上建树 然后询问的时候观察和k 的大小关系即可#include<bits/stdc++.h>#define I inline void#define R register intusing namespace std;const int N = 1e5+100;in...原创 2020-06-06 09:40:27 · 150 阅读 · 0 评论 -
HDU - 5790 Prefix 求区间不同种数的变形
我们先看一个简单的问题 给你一个数组 q次询问 每个询问 给l和r 问区间l到r有多少种不同的数这个可以离线树状数组 ,离线线段树,还可以莫队 但是现在我要你在线解决那么就只能用主席树了 还是那个套路 我们建立第0棵树 然后在0棵树的基础上建立第一颗树 然后在第一棵树的基础上建立第2棵树。。。以此类推 如果我们在建立第i棵树时 发现val[i]在前面已经出现了 我们记录这个位置 然后在第i棵树里面 让这个位置-1 然后在i位置+1 这样对于询问l,r 我们查询第r棵树里面 ...原创 2020-05-22 09:46:41 · 1127 阅读 · 0 评论 -
HDU - 5788 Level Up 主席树+树状数组
我们先说明几个结论:一个人的能力变化只会影响自己和上司 当变化的下属的能力小于等于上司的中位数 那么这个中位数会向后移动一位 否则不变 (这个画图就能体会到)所以我们需要用主席树去查询 第mid个能力值 和 第mid+1个能力值 用树状数组去维护差值 枚举每一个点 并记录可以获得的最大差值 最后答案就是初始的能力值之和+最大差值 具体可以看代码解释#include<cstdio>#include<cstring>#include<algorithm>.原创 2020-05-21 19:56:54 · 354 阅读 · 0 评论 -
HDU 4348 主席树的区间更新(另类的lazy标记)
个人觉得主席树无法像普通线段树那样更新是因为 主席树很多结点都是共用的 假如在某个结点我们把lazy标记pushdown了 那么它可能会更新其他时间点的树 这样我们访问其他时间点的树的时候 会得到错误的答案所以另类的更新是 我们不把lazy标记pushdown 而是在query操作的时候沿途累加lazy标记 当到达的区间在访问区间内时 返回当前结点的值+区间长度*累加的lazy另...原创 2020-05-06 15:57:00 · 1109 阅读 · 0 评论 -
ZOJ - 2112 Dynamic Rankings 树套树(树状数组套主席树)
要理解这题的话 首先得理解一下主席树上面的前缀和思想 我们求区间L~R第k小的时候 是用R这颗树的值减去(L-1)这棵树的值 这其中暗含了 L~R的数值在值域上的分布(瞎说) 通过这个分布我们可以向第k小靠拢 R和L-1的差值 这不是显然的前缀和思想吗 那普通的主席树我们其实可以看成数组的前缀和 当我要知道 区间L到R的值时 我就访问 R和L-1的差值 并且这是不带修改的...原创 2020-05-05 20:28:39 · 211 阅读 · 0 评论 -
HDU - 6601 Keen On Everything But Triangle 数论+主席树
题目:hdu 6601这个题其实是个很裸的主席树,关键是在复杂度分析。首先,如果对于一个区间的所有值,我们想去选一个最大周长三角形该怎么选? 因为三角形的周长要最大,我们先把值从大到小排序。用Ki表示第 i 大的边,选出K1,K2,K3,如果K1<K2+K3的话,就能构成三角形且周长最大(K1+K2<K3,K1+K3<K2 必然成立) 如果不能构成三角形,我们思考一下...原创 2020-04-28 08:21:59 · 332 阅读 · 1 评论 -
CodeForces - 853C 主席树维护矩形内的点数
n*n的矩阵 每一行给一个点 (保证列不同) 共n个点 这些点可以构成 n*(n-1)/2 个美丽矩阵 美丽矩阵的定义是 以两个点为对角的矩阵 现在有q个询问 每个询问给一个矩阵 问这个矩阵和多少个美丽矩阵相交我们得这样考虑问题 把这个n*n的矩阵分成9块7 8 94 5 61 2 3其中5对应的是我们询问的矩阵那么我们可以一次求出每一块矩阵有多少...原创 2020-04-10 14:20:14 · 501 阅读 · 0 评论 -
luogu U41492 树上数颜色 (dsu on tree 或 主席树+dfn序)
这种题还考的挺多的(口胡),我稍微总结了一下,不多,就两个题目其中一个就是luogu U41492 树上数颜色另外一个是东北四省E题算是这题的加强版此处提供两种算法:1.启发式合并 2.主席树关于启发式合并,大家可以看看这片博客https://www.luogu.org/blog/codesonic/dsu-on-tree代码略微相似:#include<...原创 2019-10-25 23:21:18 · 811 阅读 · 0 评论 -
洛谷 P3168 任务查询系统 主席树
思路:这题要求强制在线,我们先来考虑一下离线的时候该怎么写首先,他要求前ki个的和 所以我们要维护现在在执行的任务个数,其次就是任务优先级的总和(显然要离散化)然后我们可以把询问按照时间排序,这样的话根据任务开始和结束的时间 进行增或者删的操作(类似扫描线)就可以得到某一时间需要查询的答案了可是这个问题得在线,所以我们得用主席树来记录每个时间点的线段树,再询问就行啦#inc...原创 2019-10-05 20:09:27 · 123 阅读 · 0 评论