摘要: 用Splay实现区间增减,查询区间和。要对一个区间进行操作只要先把元素在序列中的位置当做键值建树,然后对l,r操作只要把l - 1 splay到根,r+1 splay到根的右子树,那么r + 1的左子树里面就有这个区间的所有的元素了。对每个节点存一些信息,就可以很方便的处理了。不过这题用splay写... 阅读全文
posted @ 2015-02-06 16:38 acm_roll 阅读(260) 评论(0) 推荐(0) 编辑
摘要: 这题由于每次都是对树全体进行操作,其实设置一个全局的延迟标记就好用到的操作主要是插入,删除子树,统计子树信息找第k大。感觉Splay可以灵活的把需要用到的节点提到根上或者是根的儿子这里还是很方便的。#include #include #include #include #include using ... 阅读全文
posted @ 2015-02-06 15:02 acm_roll 阅读(206) 评论(0) 推荐(0) 编辑
摘要: 要实现的操作是插入,删除,找到比指定值大的,小的值操作。Splay的删除操作可以是直接用二叉搜索树的删除方式,或者是先将要删除的节点Splay到根,然后找到左子树中最大的节点,将其Splay到根的左儿子位置,此时这个节点必然是没有右子树的,然后直接把他当做根就好。找大的值可以先找到如果要插入这个值会... 阅读全文
posted @ 2015-02-06 11:49 acm_roll 阅读(238) 评论(0) 推荐(0) 编辑
摘要: 很水的题,找一下前驱和后继第一次写Splay,感觉非常蛋疼,而且不用指针搞各种debug不能。他是利用伸展操作来保证平均复杂度的,不过写过Treap之后,伸展操作并不难理解= =,不过写起来感觉还是有点蛋疼的,所以这遍是仿照cxlove的写法的#include #include #include #... 阅读全文
posted @ 2015-02-06 11:24 acm_roll 阅读(163) 评论(0) 推荐(0) 编辑
摘要: 这是一个比较全面的题,涉及到了添加删除寻找第k大还有树的合并。做法大概先执行所有的删边操作,建立最终的图,这里可以用并查集维护一下, 方便判断是不是在一个联通块中,然后对每个子块建立一个Treap,如果遇到添加边导致两个联通块合并成一个的情况,就将两棵树当中小的那个合并到大的那个里面。因为每次这样的... 阅读全文
posted @ 2015-02-06 11:20 acm_roll 阅读(192) 评论(0) 推荐(0) 编辑
摘要: 这题其实就是一个在二叉搜索树里面找前驱和后继的题,以前好像用线段树+离散化搞过,弄得比较挫,学会AVL了之后就是方便。简单说一下怎么找前驱和后继,前驱的话,如果当前节点有左子树,那么前驱就是左子树中的最大节点,否则往上找第一个是他父亲节点的右儿子的节点,后继和前驱差不多,反过来就行。因为我这里没有存... 阅读全文
posted @ 2015-02-06 11:15 acm_roll 阅读(496) 评论(0) 推荐(0) 编辑
摘要: 其实这里就是用Treap来实现了一个求和的过程,其实这种区间操作还是用线段树或者是Splay比较方便。将点排序之后随便搞一下就就好,要注意的就是有点重复情况,我这里是把树的每一个节点又添加了一个cnt域来维护的,自己手撸的平衡树就是这么灵活= =#include #include #include ... 阅读全文
posted @ 2015-02-06 11:10 acm_roll 阅读(155) 评论(0) 推荐(0) 编辑
摘要: 同样是插入和寻找第k大,这里因为区间不存在包含的情况,所以可以现将区间排序然后直接搞就行了。如果存在包含的情况那就只能上主席树或者是莫队算法来搞了。#include #include #include #include #include using namespace std;struct Node... 阅读全文
posted @ 2015-02-06 11:07 acm_roll 阅读(175) 评论(0) 推荐(0) 编辑
摘要: 高中的时候做过这个,是用两个堆搞的,现在看来其实就是实现一个很简答的数据结构,能够插入元素,找第k大,用平衡树来搞其实是大材小用了,就当做是练习吧。Treap是利用除了键值之外另外一个rand_key域的随机性来保证平衡的,所以说只要随机函数够好,理论上应该是平衡的,而且写起来比较方便。#inclu... 阅读全文
posted @ 2015-02-06 11:05 acm_roll 阅读(372) 评论(0) 推荐(0) 编辑