平衡树
文章平均质量分 85
NightRaven
cust
展开
-
POJ3468 线段树||伸展树
线段树的模板题,先给一列数,然后给一些操作,Q操作查询[l,r]区间和,C操作把区间[l,r]全部加上C。最近在学伸展树,就重新把这题做了一下。用伸展树的话,以区间中间点为下表,区间和为键值建树,左孩子记左区间,右孩子记右区间。同时为了处理方便,引入编号为0和n+1的节点。每次操作时,把节点l-1伸展到根,把r+1伸展到根节点的右孩子,这样要处理的区间就被包含在根节点和他右孩子之间了,Q操作就直接原创 2013-09-20 13:23:19 · 763 阅读 · 0 评论 -
NOI2005维护数列 伸展树splay
从中午调到现在...终于调过去了..太感动了..... 中文的题目题意就不多说了...前五个操作都是最基本的splay操作,最后一个稍微麻烦点,可以先去做做http://blog.csdn.net/yanglei040/article/details/12625039这个题..要求某个区间的最大子段和的话,对于每个区间,要维护区间和sum,区间最大后缀suff,最大前缀pref,原创 2013-10-13 20:23:48 · 859 阅读 · 0 评论 -
zoj3612 Median treap
N个操作,remove x,在列表中删除一个值为x的数;add x向列表中添加一个值为x的数。每次操作后,将列表排序,输出中位数,如果删除之后为空,输出Empty,删除操作非法的话,输出Wrong!。实质还是在线求整个区间的第k大数了,可以用treap来维护,每次操作后查一下中间位置的数或者是中间两个数,求个平均值就行,删除的时候如果删到了0节点还是没找到要删的数,就返回false表示删除非法。原创 2014-04-03 10:55:17 · 619 阅读 · 0 评论 -
SPOJ 4487. Can you answer these queries VI(GSS6) splay
一个序列,四中操作,在x前插入y;删除位置x的数;把位置x的数改成y;查询区间[x,y]的最大子段和。算是维护数列的简化版吧,但时间卡的要死=...输入挂+输出挂都用上了才勉强卡过去....#include #include #include #include #include using namespace std;typedef int ll;const int maxn=2原创 2014-03-04 23:29:33 · 724 阅读 · 0 评论 -
poj 2761 Feed the dogs treap
N个数,M个查询,每次查询L到R区间的第k小元素。可以用treap离线做..读取所有的查询,按左区间排序,由于数据保证不存在互相包涵的查询,所以相邻的两个区间要么相离,要么部分交叉。相离就依次删除上一次的元素,再一次插入本次的元素;交叉就删除上次不重叠的部分,然后把本次不重叠的部分插入。#include #include #include #include #include usin原创 2014-03-04 23:24:42 · 852 阅读 · 0 评论 -
poj1442 Black Box treap
N个数,在插入第B[i]个数之后,查询当前集合中第i小的数是多少。treap模板题...#include #include #include #include #include using namespace std;typedef long long ll;const int maxn=101000;int pre[maxn];int ch[maxn][2];int si原创 2014-03-04 23:20:42 · 785 阅读 · 0 评论 -
zoj 3765 Lights splay
N个灯摆成一排,每个灯有一个权值和一个状态,现在有以下操作:Q l r sta :查询第l个到第r个中状态为sta的灯的权值的最大公约数。I i x sta : 在第i个灯后面插入一个权值为x状态为sta的灯。D i:删除第i个灯M i x :将第i个灯的权值变成xR i:改变第i个灯的状态。对每一个查询,输出一个答案。又是插入又是删除,而且key值又可以合并成一段处理原创 2014-03-02 23:46:32 · 712 阅读 · 0 评论 -
sgu 187 Twist and whirl - want to cheat 伸展树(splay)
裸的区间翻转..直接写个splay就行,线段树应该也行吧.. #include #include #include #include #include #include #include using namespace std;const int maxn=130030;int pre[maxn],ch[maxn][2],size[maxn],key[max原创 2013-12-02 10:21:08 · 1167 阅读 · 0 评论 -
poj3580 SuperMemo 伸展树 splay
依然是伸展树的基本操作,不过这次多了一个revolve x,y,z 选取x--y的子串,平移z位。也好处理,找到起点的新位置,然后把子串拆成两段,把后面的切下来插到前边就行了。要注意的一点就是z可能很大,也可能是负数.... #include #include #include #include #include #include #include #inc原创 2013-10-14 17:33:29 · 833 阅读 · 0 评论 -
BZOJ 1269 [AHOI2006]文本编辑器editor 伸展树splay
题目也是中文的就不说题意了。新开一个变量pos记录光标在第pos个节点,因为头尾同样要虚拟一个头结点和尾结点,所以光标也就是指向当前序列的第pos-1个字符。move,prev,next直接修改pos的值就行,剩下的就都是伸展树的基本操作了。insert操作就把pos伸展到根,pos+1伸展到根的下边,向pos+1的左孩子循环添加节点就行,添加完记得自底而上pushup回来。rotate就把pos原创 2013-10-09 15:42:11 · 871 阅读 · 0 评论 -
hdu3487 Play with Chain 伸展树splay
一个长度为n的数列,初始状态为1,2...n。现有两种操作,CUT a,b,c 将从a开始到b结束这段数取出,并把这段插入到取出之后这个数列的第c个数后面;FLIP a,b 将从a开始到c结束的这段数颠倒顺序。 还是基本的splay操作,为了操作方便,先添加虚拟的头结点和尾节点,再把这串数插入到头尾之间。CUT操作就把a伸展到根,把b+2伸展到根的下面,这样b+2的左孩子就是目标段a+1,b+1了原创 2013-10-08 19:24:42 · 912 阅读 · 0 评论 -
hdu 4453 Looploop 伸展树splay
给一列数构成一个环,一个指针初始指向某个位置,两个参数k1,k2。有6种操作:add x 从指针指向位置开始,连续k2个数分别加上x; reverse 从指针开始连续k1个数,反转位置. insert x 在指针指向位置的后面添加一个数x delete 删除当前指针指向的数 move x x==1时,指针前移原创 2013-10-03 13:53:33 · 1124 阅读 · 0 评论 -
hdu 1890伸展树(splay tree)区间翻转
一道用伸展树实现区间翻转的题..可能是第一次写翻转,明明是一道水题结果又搞了好久- -题意是给一串数,做n次操作,第i次操作选取区间 [a,b] 翻转,其中a为i,b为当前数组中第i小的数,并且输出翻转前第i小的数所在的位置。思路也比较好想,每个节点记录一个翻转标记flip,一个子节点数size,预先存好数组中第k大的数在原串中位置,建树时的下表就是这个位置数组(这个数组排个序,编个号就能求出来了原创 2013-09-20 19:50:11 · 990 阅读 · 0 评论 -
UVA 11996 Jewel Magic splay+字符串hash
给一个长度为n的01串,m个操作:1 p原创 2014-05-10 19:46:15 · 685 阅读 · 0 评论