平衡树
Icefox_zhx
这个作者很懒,什么都没留下…
展开
-
bzoj3224 Tyvj 1728 普通平衡树(splay/treap)
板子题哇。splay原创 2017-11-28 20:07:03 · 383 阅读 · 0 评论 -
bzoj1588 [HNOI2002]营业额统计(treap)
treap就是tree+heap。每个节点有一个值v,还有一个优先级rnd.从v来看,这是一棵bst,从rnd来看,这是一个小根堆。维护好这两个性质即可。原创 2018-02-28 09:02:22 · 327 阅读 · 0 评论 -
bzoj1691 [Usaco2007 Dec]挑剔的美食家(treap)
按b排序以后,就是求后继,用treap即可。原创 2018-02-28 09:34:55 · 263 阅读 · 0 评论 -
bzoj4825 [Hnoi2017]单旋(splay)
这题真的是太神了orz 首先我们观察一下spaly单旋最值的性质。以把min单旋到根为例。我们发现这一路上一定是不断的右旋,每次使得min深度-1,它的右子树深度不变,他的父亲及他的父亲的右子树深度+1。最终形态就是min成为了根,原来的根接在了min的右子树上,min原来的右子树接在了fa[min]的左子树上。除了min的右子树深度未变以外,其余节点深度均+1,min的深度变为1.单旋最大...原创 2018-03-08 17:06:43 · 364 阅读 · 0 评论 -
bzoj2733 [HNOI2012]永无乡(并查集+线段树合并/启发式平衡树合并)
每个连通块维护一棵权值线段树即可。动态开点,查询时去线段树上爬即可。然后每次合并集合的时候把线段树也合并了。关于线段树合并:传送门 upd:也可以启发式合并平衡树,每次把sz小的直接塞到sz大的中去。线段树合并#include <cstdio>#include <cstring>#include <algorithm>#include <...原创 2018-02-14 16:51:44 · 374 阅读 · 0 评论 -
bzoj3065 带插入区间K小值(替罪羊树套动态开点线段树)
替罪羊树呢就是不用旋转的平衡树,那不旋转如何维持平衡呢?我们设定一个α\alpha值,每当一个点不满足大小平衡时我们就暴力重构那一部分。用平衡树维护区间位置,每个节点一棵权值线段树。查询的时候我们就把x~y区间搞出来(用一堆权值线段树和单点表示),然后类似主席树求第k小的去树上二分找一下即可。此题还要回收垃圾。。。因为内存不够!删除还有回收的时候记得传引用,因为你还要断掉他父亲和他的边。重构的时候只原创 2018-02-24 22:11:08 · 433 阅读 · 0 评论 -
hdu2475 Box(splay/lct)
这题好神呀。lct做法参见:传送门 这里说说splay做法。我们考虑一棵树的dfs序。进点x的时候记下x,出点x的时候记下x+n。则x的子树就是区间[x,x+n]。则操作1就相当于删除一个区间的数,然后把这一整个区间的数插入一个数的后面。x节点所在的根就是dfs序最前面的那个节点。然后就可以做了,不过需要奇怪的splay姿势【再见】原创 2018-03-04 00:16:34 · 325 阅读 · 0 评论 -
bzoj3544 [ONTAK2010]Creative Accounting(贪心+splay)
求模意义下的最大区间和。我们考虑l…r的区间和为sum[r]-sum[l-1],其中sum[i]表示前缀和。我们发现对于l…r的区间和,如果固定a[r],最优的a[l]就是a[r]的后继。为什么呢。因为a[l]在a[r]前面还大于a[r],说明取过模,l+1..r的和就是a[r]+mod-a[l]。那么我们显然最小化这个a[l]最好,也就是后继。(为什么不选比a[r]小的,因为那样的话和就是a[r...原创 2018-03-17 20:37:28 · 321 阅读 · 0 评论 -
hdu4441 Queue Sequence(splay)
维护一个序列,三种操作: 1.insert p,在第p个位置(从0开始编号)之前插入目前不在序列中的最小正整数x,并在合法的最右位置插入-x。 2.remove x 删掉序列中的x和-x 3.query x 查询序列中x与-x之间的数的和 对于操作1,目前不在序列中的最小正整数可以用一个优先队列来维护,或者用线段树也行。合法的最右位置是哪里呢?如果p位置之前有t个正数,则合法的最右位置就是第原创 2018-02-25 13:40:46 · 367 阅读 · 0 评论 -
bzoj5159 [Tjoi2014]电影评分(splay+后缀平衡树)
按道理应该是一定会挂精度的,正解应该是后缀平衡树来比较两个数的小数部分的大小。但是数据水,直接long double是可以水过的【逃】。正解待更新。。tips:注意是最早的而不是标号最小的,我们还要枚举一下题意,发现他说的是如果评分相同就按出现时间给排名【逃】。3.13upd:更新正解 我们现在的问题是如何比较两个实数的大小。我们可以直接比较整数部分, 注意到小数部分可以看成一个二进制...原创 2018-03-12 23:04:44 · 467 阅读 · 0 评论 -
bzoj2258 pku2758 Checking the Text 文本校对(Hash+二分+splay)
带插入,求lcp。和bzoj1014一样。 我的splay常数是真的大【捂脸】原创 2018-03-20 20:01:51 · 296 阅读 · 0 评论 -
bzoj3173 [Tjoi2013]最长上升子序列(dp+splay)
从小到大插入一个数,求lis。用splay维护dp[i]即可。原创 2018-03-21 10:20:03 · 372 阅读 · 0 评论 -
bzoj2827 千山鸟飞绝(平衡树+map)
把坐标用map离散化掉。我们考虑把一个点x加到集合y中的影响: 首先是对x点的影响:用集合y中的最大值更新ans1,用集合大小更新ans2. 然后是对集合y的影响:每个点的ans1都可以由v[x]更新,ans2都可以由集合大小更新。 因此我们就要维护集合最大值,集合大小,还要能够打标记,支持插入删除。 用splay即可。原创 2018-03-21 22:13:44 · 349 阅读 · 0 评论 -
bzoj1056 [HAOI2008]排名系统(splay+Hash)
题目就是个裸的平衡树。 但是读入很鬼畜,需要好好写个hash。 数据还有锅,第七个点得分超过了八位正整数!需要ll。原创 2018-04-10 14:14:17 · 277 阅读 · 0 评论 -
bzoj3786 星系探索(ETT)
ETT就是Euler Tour Tree,用平衡树来维护欧拉序。 而欧拉序可以写成很多形式: 1.The first way is to write down all edges of the tree, directed, in order of DFS. This is how ETT is defined on 2.The second way is to store vertices...原创 2018-06-14 10:05:35 · 426 阅读 · 0 评论 -
CF414E Mashmokh's Designed Problem(ETT+二分)
ETT维护欧拉序。每个点维护它的深度,出点入点基本无异。 第一个操作求个lca就好了qaq,x,y的lca就是(in[x],out[y])中深度最小的点的父亲。 第二个操作,x的kth祖先,就是[1,in[x]]中最靠右的深度为dep[x]-k的点。 第三个操作,我们注意到欧拉序上一段连续的区间的深度是连续的,于是我们可以维护每个区间的深度最小/最大值,然后二分来找到深度k的最后一个出现位置...原创 2018-06-14 12:18:54 · 481 阅读 · 0 评论 -
【LGR-048 五周年庆贺】洛谷6月月赛
我居然忘了…忘了…20多分钟后才开qaq 然后就写不完啦!ggA水题直接算#include &amp;amp;lt;bits/stdc++.h&amp;amp;gt;using namespace std;#define ll long long#define inf 0x3f3f3f3f#define N 200010double v,a;double const g=10;int main...原创 2018-06-18 23:20:58 · 447 阅读 · 0 评论 -
bzoj4530 [Bjoi2014]大融合(lct维护虚边信息)
把(x,y)这条边当根,答案显然就是sz[x]*sz[y]。我们需要动态维护子树大小这个信息。lct显然可以胜任。不同的是,我们还需要维护虚边的信息。怎么办呢?我们发现,虚边信息只会在link和access时有改变。于是我们记sz[x]为x的子树总信息,isz[x]为x的虚边链接的子树信息。link时注意要把x和y都边成根(这样只需要维护y的虚边信息即可)。access时把虚边信息改对。原创 2018-02-16 22:01:55 · 485 阅读 · 0 评论 -
bzoj1208 [HNOI2004]宠物收养所(平衡树)
就是平衡树求个前驱后继。记一下当前树上是人还是狗。原创 2018-02-16 18:49:12 · 329 阅读 · 0 评论 -
bzoj3435 [Wc2014]紫荆花之恋(替罪羊树+动态点分治+treap)
我们维护点分树,每个节点维护一颗平衡树,记录所有子树中的点的值。然后查询时我们往上一直跳就好了,注意要去掉不合法的情况,因此我们每个点还要再维护一个平衡树,记录所有子树中的点到fa[p]的值,往上跳的时候减掉不合法的即可。然后因为是动态生成点的,所以我们不时地要重构一下。利用替罪羊树的思想重构即可。 值得注意的几点:每次重构时,要把此次需要重构的点标记出来,在点分治dfs时不要访问不需要重构的点...原创 2018-02-27 23:16:10 · 601 阅读 · 0 评论 -
bzoj3223 Tyvj 1729 文艺平衡树 (splay)
就维护一个区间反转。原创 2017-11-30 16:16:14 · 278 阅读 · 0 评论 -
bzoj1503 [NOI2004]郁闷的出纳员(splay)
其实挺简单的一道平衡树板子题。。。奈何调了两天。。。在wrx 大佬的帮助下终于调出了程序。。。并发现了自己一直以来的一个错误认识。在insert的时候,必须把p的sz也更新对。因为p可能是root,就不会splay,也就不会更新,也就会是错的。%%%wrx原创 2017-12-05 21:10:40 · 335 阅读 · 0 评论 -
bzoj1500 [NOI2005]维修数列(splay)
打了一晚上才改对。。太弱了。原创 2017-11-28 07:35:17 · 327 阅读 · 0 评论 -
luogu2710 数列(splay)
和维修数列一样。原创 2017-11-28 13:16:57 · 247 阅读 · 0 评论 -
bzoj1014 [JSOI2008]火星人prefix(二分答案+哈希+平衡树)
我每次询问,用二分答案+hash去求lcp。 splay维护一下插入和修改。点p的hash值就是 hs[l]∗(sz[r]+1)+hs[p]∗sz[r]+hs[r]hs[l]*(sz[r]+1)+hs[p]*sz[r]+hs[r]原创 2018-01-30 18:19:04 · 371 阅读 · 0 评论 -
bzoj2329 [HNOI2011]括号修复(splay)
首先我们发现对于一个括号序列,可以先贪心地把能配对的都消掉,剩下的括号一定是)))(((这样的,我们记作(a,b),则不难发现,答案就是(a+1)/2+(b+1)/2.因此我们只需维护括号序列(a,b)。可以像捉迷藏那题一样的维护。但是我们发现翻转或反转后,括号序列完全不一样了x。怎么办呢。于是我们再维护一个完全反着的括号序列(a2,b2)。我们发现翻转其实就是反转操作之后从右往左看的结果。于是乎就原创 2018-01-31 14:45:43 · 298 阅读 · 0 评论 -
bzoj1552 [Cerc2007]robotic sort(splay)
题目中的编号排完序其实就没嘛用了。。。主要就是一个区间翻转的操作。但是要找到数x的位置,把它转到根,就要提前把根到x的路径上的点都下放了,把x先做对,才能去转。原创 2018-01-25 16:03:29 · 274 阅读 · 0 评论 -
bzoj1251 序列终结者(splay)
区间加,区间翻转,区间最大值。splay直接上。原创 2018-01-25 23:10:14 · 273 阅读 · 0 评论 -
bzoj4864 [BeiJing 2017 Wc]神秘物质(splay)
区间极值最大值一定是最大值-最小值,区间极值最小值一定是相邻两个数的差,因此我们还要维护区间最右和最左是几。原创 2018-01-30 14:05:46 · 318 阅读 · 0 评论 -
bzoj1895 Pku3580 supermemo(splay)
就revolve操作比较特殊。这里对序列的revolve相当于循环移位,向右移。我们可以先算出循环移位之后新的第一个数原来的位置pos。 比如对于rotate(1,n,t),我们算出pos,然后翻转(1,pos-1)(pos,n)(1,n)即可。自己举举例子就看出来了。原创 2018-01-30 16:31:47 · 305 阅读 · 0 评论 -
luogu3960【noip2017】列队(动态开点splay)
许久的坑,在wc崩坏之后填一填。因为空间不够,所以要动态开点。每行前m-1个位置用一棵splay维护编号,最后一列用一棵splay维护。蒟蒻至今不会树状数组做法,还希望有dalao指教。原创 2018-02-12 14:37:10 · 417 阅读 · 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 · 461 阅读 · 0 评论 -
bzoj3262 陌上花开(树状数组套splay/cdq分治)
求三维偏序,可以树套树,第一维排序解决,第二维树状数组,第三维splay 或者cdq分治解决,要注意处理相同权值,细节较多。树状数组套splay#include <cstdio>#include <cstring>#include <algorithm>#include <queue>using namespace std;#...原创 2018-02-26 22:03:45 · 314 阅读 · 0 评论 -
CF38G Queue(splay)
题目大意:顺次加入n个点,每个点有一个重要度a和一个交换次数限制c。保证所有的a是1~n的一个排列。每次加入一个点i时,先把i放在队尾,每次与前一个点作比较,如果i重要度更大且还有交换次数就和前一个人交换。问最后的队列是什么样子的。 我们可以用splay来搞。我写的大概有点丑。大概就是看是次数用光了还是碰到一个重要度比自己高的,在树上二分找一下第一个比自己高的,然后插在他后面。原创 2018-02-13 17:59:21 · 394 阅读 · 0 评论 -
bzoj4025 二分图(lct)
如何维护这个图是不是二分图呢,我们就来维护一下图中奇环的数量。我们把每条边按扫描线那样分成两个事件来处理。把所有事件按时间排序。我们维护一棵树,每条边的权值是这条边的删除时间,我们维护一棵类似最大生成树的树。这样加进一条边以后只需要与当前树上的边进行判断即可。遇到加边事件: 1)如果加的是一条树边,就直接加树边。 2)如果是一条非树边,替换掉环中最小的一条边,然后: 1.构成奇环,奇环原创 2018-02-14 20:36:38 · 613 阅读 · 0 评论 -
hdu3726 Graph and Queries(离线+平衡树启发式合并)
我们把操作离线,删边操作就变成了合并。每个连通块维护一棵splay,合并时把sz小的暴力插到sz大的里面去即可。复杂度O(nlog2n)O(nlog^2n),为什么呢,因为一个点x被暴力插入一次,则它的sz至少大了一倍,所以一个点最多暴力插入logn次。 tips:ins之后要转到跟呀转到跟!原创 2018-02-24 14:16:42 · 397 阅读 · 0 评论 -
bzoj3600 没有人的算术(替罪羊树动态标号+线段树)
最大值线段树维护即可。 问题就是一个动态标号。 可以用重量平衡树–替罪羊树来做。 复杂度O(mlogn+mlogm)O(mlogn+mlogm)O(mlogn+mlogm)#include <bits/stdc++.h>using namespace std;#define ll long long#define inf 0x3f3f3f3f#define N 100...原创 2018-07-14 21:31:05 · 349 阅读 · 0 评论