主席树
Icefox_zhx
这个作者很懒,什么都没留下…
展开
-
poj2104 K-th Number(主席树模板)
首先离散化,然后对于每个前缀1…i,建立一颗权值线段树。那么l…r的区间信息,就是tree[r]-tree[l-1]。然后因为直接开肯定开不下,我们发现第i棵线段树和第i-1棵线段树基本相同,只有一条链被更改了,因此我们可以利用这一点减少空间花销。也就是说对于每一棵线段树,我只新建出这次被修改了的一条链,所以总的空间复杂度是O(nlogn)的。时间复杂度还是O(nlogn)的。原创 2017-11-30 21:23:36 · 365 阅读 · 0 评论 -
bzoj3207 花神的嘲讽计划Ⅰ(hash+主席树)
因为K是固定的,我们把原串的所有长度为K的子串都hash了。 每次查询就相当于在区间内询问一个数是否存在。可以主席树来搞一搞,也可以离线莫队什么的。。。原创 2018-03-19 21:31:02 · 256 阅读 · 0 评论 -
bzoj3681 Arietta(dsu on tree+主席树优化建图+网络流)
显然就是个建图最大流。然而边数爆炸。 我们考虑每个节点维护一棵线段树表示子树信息来优化建图,然后边数还是爆炸。 我们再考虑树上建主席树来优化建图,不错,好像可以了,然而子树信息不可减(维护的是权值为x的点的标号)gg这时候我们要用到一种黑科技:dsu on tree! 也就是树上启发式合并。更多参考资料:portal大概就是划分轻重链,然后轻边暴力,这样复杂度就科学了! 具体说下:每个点的线原创 2018-04-26 21:50:17 · 362 阅读 · 0 评论 -
bzoj3218 a + b Problem(主席树优化建图+最小割)
首先我们考虑朴素建图,S->i,bi ; i->T,wi ; i->i’,pi ; i’->j,inf,如果j会使得i变奇怪。 但是这样最后一类边可能O(n2)O(n^2),gg 我们考虑主席树优化即可。 点数O(2n+nlogn)O(2n+nlogn) 边数O(2nlogn+4n+nlogn)O(2nlogn+4n+nlogn)原创 2018-04-27 08:52:20 · 329 阅读 · 0 评论 -
loj2555「CTSC2018」混合果汁(二分答案+主席树)
二分答案,查询最小花费即可。用主席树来维护就好啦#include <bits/stdc++.h>using namespace std;#define ll long long#define inf 0x3f3f3f3f#define N 100010inline char gc(){ static char buf[1<<16],*S,*T; ...原创 2018-05-17 22:08:31 · 415 阅读 · 0 评论 -
bzoj4571 [Scoi2016]美味(主席树+按位贪心)
考虑如果没有+x,那么直接可持久化Trie+按位贪心即可。 有+x怎么办呢?我们考虑在Trie树上跑的过程,实际上每次选择时就是看一个区间内有没有数。那么我现在就是要把这个区间左移x位即可。用主席树模拟Trie树的这一过程即可。 复杂度O(nlogn+mlog2n)O(nlogn+mlog^2n)原创 2018-04-27 13:39:48 · 298 阅读 · 0 评论 -
bzoj4504 K个串(主席树+堆)
很类似bzoj2006。 只是这次的区间和比较难算,我们需要建主席树来求。 rt[i]的每个叶节点x,表示右端点为i时左端点为x时的答案。 每个节点要维护区间最大值,及最大值所在位置。 我们有两种操作,区间加和查询区间最大值。 区间加的主席树比较麻烦。下放时要新建节点太慢了。 我们可以考虑标记永久化。不下放标记。 然后类似超级钢琴那题用堆来维护贪心就好啦。 或者也可以每次去删掉最大...原创 2018-05-05 16:38:07 · 299 阅读 · 0 评论 -
bzoj5361 [Lydsy1805月赛]对称数(树上主席树+二分答案)
给定一棵树,每个点有权值,求路径上最小的出现了偶数次(可以为0)的权值。 比赛时试图树上莫队+线段树(O(nlogn−−−−−√)O(nlogn)O(\sqrt{nlogn}))卡过去,然而当然是不可能的啦囧。正解是我们对每个点一颗线段树维护到根的路径上的权值区间的异或和。 但是这样很有可能冲突,于是我们对每种权值随机一个ull的数,出现权值x的时候我们就异或上w[x]。这样如果一个权值区...原创 2018-05-27 22:17:32 · 462 阅读 · 0 评论 -
bzoj5358 [Lydsy1805月赛]口算训练(分解质因数+主席树/二分)
给定一个序列,求[l,r]的数的乘积是不是d的倍数。 我们考虑给d分解质因数,如果对于每个质因数这个区间内的个数都大于它的次数,那么就是d的倍数。而1e5以内的数最多有6个不同的质因数。 我们考虑给每个数分解质因数,维护区间和即可。我写的主席树。 其实也可以直接对于每种质因数记下它每一次出现的位置及个数,然后每次询问时去二分。 复杂度都是O(n(n−−√+6logn))O(n(n+6log...原创 2018-05-27 22:23:12 · 317 阅读 · 0 评论 -
bzoj4448 [Scoi2015]情报传递(树上主席树+离线)
#include &lt;bits/stdc++.h&gt;using namespace std;#define ll long long#define inf 0x3f3f3f3f#define N 200010inline char gc(){ static char buf[1&lt;&lt;16],*S,*T; if(T==S){T=(S=buf)+fread(...原创 2018-06-22 12:02:32 · 231 阅读 · 0 评论 -
bzoj4826 [Hnoi2017]影魔(单调栈+主席树)
我们先单调栈求出每一个数左边/右边第一个大于他的数的位置L,R 那么以a[i]为最大数的贡献是: 左端点L[i],右端点R[i],贡献p1 左端点L[i]+1~i-1,右端点R[i],贡献p2 左端点L[i],右端点i+1~R[i]-1,贡献p2 我们如果把左右端点当做坐标的话,投射到二维平面上,那么我们每次求的就是一个矩形和。有一些单点加,某一维上的线段加。因此可以直接用主席树解决O(...原创 2018-06-16 16:19:26 · 326 阅读 · 0 评论 -
bzoj3123 [Sdoi2013]森林(树上主席树+启发式合并)
求路径k小值,树上主席树即可。 还有合并两棵树的操作,我们可以启发式合并。 复杂度O(nlog2n)O(nlog2n)O(nlog^2n)这题真是充分体现了我的zz 一开始 洛谷 T,发现离散化以后就过了luogu 然后bzoj T ,怪罪于垃圾回收,删了果然过了 然而突然发现,我的启发式合并是假的x 我用的sz可能不是整块的… 倒是经过一波常数优化跑进了前五qaq#inclu...原创 2018-06-16 17:43:37 · 409 阅读 · 1 评论 -
bzoj3065 带插入区间K小值(替罪羊树套动态开点线段树)
替罪羊树呢就是不用旋转的平衡树,那不旋转如何维持平衡呢?我们设定一个α\alpha值,每当一个点不满足大小平衡时我们就暴力重构那一部分。用平衡树维护区间位置,每个节点一棵权值线段树。查询的时候我们就把x~y区间搞出来(用一堆权值线段树和单点表示),然后类似主席树求第k小的去树上二分找一下即可。此题还要回收垃圾。。。因为内存不够!删除还有回收的时候记得传引用,因为你还要断掉他父亲和他的边。重构的时候只原创 2018-02-24 22:11:08 · 453 阅读 · 0 评论 -
bzoj4012 [HNOI2015]开店(动态点分治+二分+STL/树链剖分+主席树)
如何求所有点到一个点的距离和呢?类似bzoj3924我们的处理方法。 对于每个节点x维护 s1[x]–x的子树中的点到x的距离 s2[x]–x的子树中的点到fa[x]的距离 然后logn的在重心树上跳一跳,减去重复的,补上少的即可。 这题还有一个年龄的限制,怎么办呢?很容易想到线段树,但是我不会写gg 我们还可以利用vector+二分来做。 把所有点按年龄从小到大排序,做前缀和。每次...原创 2018-02-23 23:42:18 · 361 阅读 · 0 评论 -
bzoj1146 [CTSC2008]网络管理(树上主席树,树状数组套动态加点线段树)
给定一棵树,查询路径第k大值,带修改。 就是bzoj2588+bzoj3196 树上建主席树。然后对于修改,修改点x的权值,只会对x的子树有影响,而x的子树在dfs序上是连续的一段in[x],out[x],就相当于区间修改,我们利用差分+树状数组来维护,另建bit+动态加点线段树来维护。 树状数组套动态加点线段树内存究竟怎么算.jpg???能开多大是多大好了,反正是要比logn^2小很多?这样原创 2018-02-26 20:45:05 · 358 阅读 · 0 评论 -
hdu5919 Sequence II(主席树求第k小)
因为一段区间内一个数第一次出现的位置才有效,所以我们维护n棵线段树,分别表示一个后缀区间的信息,倒着插入所有的a[i],维护区间和。查询的时候,我们就先求出区间内不同数的个数(即有几个位置被标记了),然后在线段树上查第k小。原创 2017-12-01 10:10:57 · 261 阅读 · 0 评论 -
hdu4348 To the moon(区间修改,区间查询的主席树)
每个时间建一棵线段树,这样就很好回到过去的某一版本了。然后区间修改就像线段树那样,但是不能下放懒标记,因为你的左右子树可能是公用的历史版本,会出锅。你只能记成绝对标记。每次在路径上累加懒标记。还要注意区间长度。原创 2017-12-01 11:52:43 · 454 阅读 · 0 评论 -
bzoj2588 Count on a tree(树上建主席树求路径第k大)
主席上树(划去。 每个点建一棵权值线段树,记录从这个点到根的路径上的点权信息。x可以和fa[x]的线段树共用很多信息,所以上主席树!那么x到y路径上的点权信息,就是tree[x]+tree[y]-tree[t]-tree[fa[t]],t表示lca(x,y)。原创 2017-12-01 19:37:46 · 538 阅读 · 0 评论 -
bzoj4408 [Fjoi 2016]神秘数(主席树维护前缀和)
如果神秘数现在是ans,统计一下[1,ans]所有在这段区间中出现过的数的sum,如果sum< ans 那么ans肯定永远表示不出了,他就是答案;如果sum>=ans,那么ans是可以得到的,那么把神秘数改为sum+1,继续尝试。建权值线段树,用主席树维护区间前缀和信息即可原创 2017-12-01 20:03:49 · 529 阅读 · 1 评论 -
bzoj3524 [Poi2014]Couriers(主席树查询第k小)
这题改了半天,我怕不是个sb x。一个区间内出现次数大于r-l+1>>1的数最多就有一个啊!,所以直接在线段树上找复杂度不会有问题的。原创 2017-12-02 13:53:15 · 306 阅读 · 0 评论 -
bzoj2223 [Coci 2009]PATULJCI(同bzoj3524)
bzoj2223 [Coci 2009]PATULJCI(同bzoj3524)原创 2017-12-02 14:03:41 · 294 阅读 · 0 评论 -
bzoj1901 Zju2112 Dynamic Rankings(主席树+树状数组)
带修改的主席树。回忆我们求区间第k小的怎么求?我们实质上是用两个前缀和去减。那现在有了修改,说明我们需要维护前缀和。那什么东西可以用来快速的维护前缀和呢?树状数组。也就是说我们每次在树状数组上跑,更新logn棵线段树的值。每颗线段树维护树状数组相应的区间信息。然后我们查询的时候,按树状数组那样记下所有正贡献的线段树,和负贡献的线段树。然后若干个线段树的信息合并成正确的信息。 复杂度O(nlog2n原创 2017-12-02 21:33:19 · 403 阅读 · 0 评论 -
AtCoder Regular Contest 068
AtCoder Regular Contest 068 题目链接: https://arc068.contest.atcoder.jp/ C.X: Yet Another Die Game(结论题) D.Card Eater(结论题) E.Snuke Line(思路+主席树) 我们考虑怎样的区间内不含k的倍数,显然就是0,k,2k,3k,…m之间的区间,即[1,k-1],[k+1,2k-原创 2017-12-20 09:59:58 · 438 阅读 · 1 评论 -
bzoj3545 [ONTAK2010]Peaks(离线+kruskal+主席树+线段树合并)
首先我们可以离线做。把询问按x排序,给每个点建一棵权值线段树。然后一边跑mst,一边维护线段树。每次合并两个点的时候,就要合并两棵线段树。合并的时候要小心因为合并叶子时不能pushup,所以还是每次相加比较稳妥。然后合并的总复杂度应该就是合并时删掉的节点数,是O(nlogn)的,可以接受。所以总复杂度O(nlogn+mlogm原创 2017-12-03 21:12:56 · 353 阅读 · 0 评论 -
bzoj3551 [ONTAK2010]Peaks加强版(kruskal重构树+dfs序+主席树+树上倍增)
题意同bzoj3545,只不过强制在线了。那强制在线了怎么搞呢x,有一个神奇的东西,kruskal重构树,张这个样子:传送门。他有很多优美的性质:首先,他一定是一颗二叉树,然后所有叶子节点一定是原图中的点,从叶子节点往跟走,点权一定是单调不降的。如果原图中有n个点,则这棵树一定有n+n-1个点(因为你需要合并n-1次,也就新建了n-1个点)。然后对于这道题而言,你可以从v开始在树上倍增找到第一个小于原创 2017-12-04 19:31:04 · 449 阅读 · 0 评论 -
bzoj3196 Tyvj 1730 二逼平衡树(树套树,线段树套splay/bit套动态开点线段树)
线段树套splay,看网上题解大部分说套splay是过不去的,需要优越的姿势才可以,本想着过不去再卡一卡优越的姿势的,然而过了qaq。 线段树维护区间,对于线段树的每个节点我们吊一棵splay维护区间内的权值。 操作1:查询k在区间[l,r]上的排名。 线段树上查询区间,去splay上查询小于k的有多少个,都加起来即可,再加1就是k的排名。 操作2:查询区间[l,r]上的排名为k的数。 ...原创 2018-02-25 22:27:11 · 493 阅读 · 0 评论 -
【UNR #3】Day1
A(70)#include &lt;bits/stdc++.h&gt;using namespace std;#define ll long long#define inf 0x3f3f3f3f#define N 200010inline char gc(){ static char buf[1&lt;&lt;16],*S,*T; if(T==S){T=(S=buf)...原创 2018-07-13 16:31:01 · 358 阅读 · 0 评论