题意:一开始给出一个序列\(1,2...n\),然后\(m\)次操作,每次把\([l,r]\)翻转并且拼接到序列的后面,求最后形成的序列 打个pushdown标记就好 #include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<string> #inc…
紫薯例题 #include<bits/stdc++.h> using namespace std; typedef long long ll; ,inf=0x3f3f3f3f; ],ch[N*][],tot,n,d,ver; ]; #define l(u) ch[u][0] #define r(u) ch[u][1] int rnd() { )-,X=; )%M; return seed=(ll)seed*X%M; } ,l(u)=r(u)=,val[u]=c; return u;} int…
题意:\(n\)个人排队,每个人有重要度\(p\)和不要脸度\(c\),如果第\(i\)个人的重要度大于第\(i-1\)个人的重要度,那么他们之间可以交换,不要脸度-1,交换后先前的第\(i\)个人也可以继续和当前第\(i-2\)个人继续执行下去直到第\(i\)个人走到首位或者不要脸度为0,问从1开始入列到n,每个人进入队列后最后一人都执行这样的操作,最后队列的排列是怎样的 可持久化Treap维护区间的最大值,当第\(i\)人入列后就二分枚举从\(i-1\)开始算的长度,使得当前的人尽可能的靠前…
实现功能:同splay区间反转 1(基于BZOJ3223 文艺平衡树) 这次改用了一个全新的模板(HansBug:琢磨了我大半天啊有木有),大大简化了程序,同时对于splay的功能也有所完善 这里面没有像一般二叉排序树那样子用一个参量进行排序,而是直接以中序遍历来构建了一个普通的二叉树(当然也可以把每个点的中序遍历排名视作参量),然后插入的时候就是指定位置插入(这个就比较像是文本插入了) 总之得到了较大的提升,代码优美程度也提高不少 var i,j,k,l,m,n,head,tot,ll:lon…
题目链接 题意 对于各个以往的历史版本实现以下操作: 在第 p 个数后插入数 x . 删除第 p 个数. 翻转区间 [l,r],例如原序列是 \(\{5,4,3,2,1\}\),翻转区间 [2,4] 后,结果是 \(\{5,2,3,4,1\}\). 查询区间 [l,r]中所有数的和. 做法:可持久化treap 定义 typedef pair<int,int> Pair; 结构体 struct Node { int key, val, l, r, sum, size;// 键值 随机值 左子 右…
终于写了一次可持久化Treap,做的是可持久化序列的模板题. Treap Treap=Tree+Heap,是一个随机化的数据结构.它的每个节点至少有两个关键字,一个是我们要存储的\(val\),一个是随机堆关键字,我把它称为\(hp\).Treap满足的性质是\(val\)从小到大,并且每个节点的\(hp\)都小于(或都大于)儿子节点的\(hp\)值.也就是说,通过一个随机数来让Treap具有堆的性质,从而使得其期望深度为\(O(logn)\). 旋转 Treap可以通过旋转来保持其平衡,操作与…
FHQ treap 的整理 treap = tree + heap,即同时满足二叉搜索树和堆的性质. 为了使树尽可能的保证两边的大小平衡,所以有一个key值,使他满足堆得性质,来维护树的平衡,key值是随机的. treap有一般平衡树的功能,前驱.后继.第k大.查询排名.插入.删除.也比较好写 但是对于区间上的问题是不能做的,例如 区间增减 区间求最值 区间反转(倒序) 区间移动(把一段剪切.粘贴) (splay是可以做的) 但是有一种神奇的数据结构,即可以满足treap的功能,也可以区间上进行…
平衡树(二叉树) 线段树不支持插入or删除一个数于是平衡树产生了 常见平衡树:treap(比sbt慢,好写吧),SBT(快,比较好写,有些功能不支持),splay(特别慢,复杂度当做根号n来用,功能强大,不好写),rbt(红黑树,特别快),//替罪羊树,朝鲜树 晚上要讲的不旋转平衡树:   平衡树: 节点的左儿子中的每一个一定比他小,右儿子中的每一个一定比他大 那么它的中序遍历是有序的 用下标建树,那么区间询问的话就是求一棵子数和子树根和领一棵子数的一部分   treap: tree+heap,…
对于大神来说这题是水题.我搞这题花了快2天. 伸展树的优点有什么,就是树不管你怎么旋转序列是不会改变得,并且你要使区间反转,只要把第k大的点转到根结点,那么它的左子树就是要交换的区间[l,r),然后交换左右 子树就可以了(中序),根结点的位置就是i+siz[ch[root][0]],i是处理完的结点个数,siz[ch[root][0]]就是左子树(需要旋转的个数). 旋转可以用lazy思想标记,这样时间就为logn了.由于第k大的值已经处理完成,所以直接将根结点删除. 代码: #include<…
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4156 题目拷贝难度大我就不复制了. 题目大意:维护一个字符串,要求支持插入.删除操作,还有输出第 i 次操作后的某个子串.强制在线. 思路1:使用可持久化treap可破,详细可见CLJ的<可持久化数据结构的研究>. 思路2:rope大法好,详见:http…