
ACM_高级数据结构
文章平均质量分 78
9974
这个作者很懒,什么都没留下…
展开
-
hdu 1890 伸展树区间翻转
题意: 给你n个数,每次先输出第i大的数的位置(如果有多个,选下标小的那个),然后每次将第i个位置到第i大的数所在位置之间的数进行翻转。思路:输入的数组可能有多个相同的值,我们可以进行两次排序把数组的值变为1---n(表示第几大)。在建伸展树的时候我们可以顺便用pos[i]记录第i大的数的节点标号。对于第i次操作,我们用col[]数组记录翻转标记,每次先把第i大的节点pos[i]旋转到原创 2013-09-02 23:18:09 · 1273 阅读 · 0 评论 -
hdu 4699 2个栈维护 or 伸展树 (2013多校联合)
hdu 4699 Editor题意:对一个数列进行操作,光标位置后面插入一个权值为x的数,删除光标前的那个数,光标左移一位,光标右移一位,求到k位置的最大的前缀和。。注意这里的k是在光标之前的,由于这个条件,所以这题又简单的2个栈维护可以解,如果没有这个条件,那么就要用伸展树了。栈的解法叉姐的解题报告有,我这里说说伸展树的做法, 1.8MS卡过。我们用cur表示光标在第几个数的右原创 2013-08-27 17:20:31 · 2442 阅读 · 0 评论 -
ZOJ Monthly, March 2014 (2014省赛练习)
Yes3757Alice and Bob and Cue Sports25.54% (35/137)Yes3758Singles' Day44.00% (55/125)3759345625.00% (3/12)Yes3760Treasure Hunting13.74% (18/131原创 2014-03-03 19:57:54 · 1694 阅读 · 1 评论 -
hdu1890 伸展树区间翻转复习
题意: 给你n个数,每次先输出第i大的数的位置(如果有多个,选下标小的那个),然后每次将第i个位置到第i大的数所在位置之间的数进行翻转。思路:输入的数组可能有多个相同的值,我们可以进行两次排序把数组的值变为0---n-1(表示第几大)。在建伸展树的时候我们可以顺便用pos[i]记录第i大的数的节点指针。对于第i次操作,我们用flip记录翻转标记,每次先把第i大的节点pos[原创 2014-02-16 00:22:18 · 1523 阅读 · 0 评论 -
大视野1588 splay简单题
题目连接题意: 给你n个数,要求对于所有的i, 求出第i个数 和1------- i-1之间的数里找一个与第i 个数绝对值差值最小, 求所有的差值之和做法: 对于第i个数v,把v 插入伸展树,若v存在就不插入,并把v所在的节点旋转到根,在通过根的左右子树找最接近的左右两个数,更新答案即可#include #include #include using namespace st原创 2014-02-12 23:55:58 · 1525 阅读 · 2 评论 -
SPOJ Free tour II 点分治
论文第二题,看了论文的思路,自己敲出来的g++ 4.3.2交AC#include #include #include #include using namespace std;const int maxn = 200005;const int inf = 2*1e9+7;struct Edge { int v, w, next; Edge(int v, int原创 2014-02-23 15:52:53 · 1166 阅读 · 0 评论 -
POJ 1741 树的分治(点分治)入门
看一下09年漆子超的论文,是论文的第一题,思路在其中讲得很清楚了。复杂度分析:每次先找当前树的重心,再从重心为根遍历这颗树, 从表面上看来这个复杂度很大,但事实并非如此,通过找多次重心,使整棵树的深度不超过log(n), 所以对于每个点的访问次数不超过log(n), 总体复杂度nlog(n), 如果在dfs里面添加一些操作,那么就要把复杂度乘上去,这题cal的复杂度是log(n), 总体复杂度原创 2014-02-20 19:38:46 · 1356 阅读 · 0 评论 -
UVA 12538 可持久化treap入门
还新学了能可持久化的treap看了一下clj的《可持久化数据结构研究》论文。做了一下UVA 12538,算是会了一点点了。可持久化treap不用进行rotate操作,它有两个基本的操作merge(a,b):把 treap与treap>合并成treap split(a,k):把treap>的前k个变成一个treap,剩下的元素变成treap可以根据需要来选择是否实现可持久原创 2014-01-19 22:35:36 · 2865 阅读 · 0 评论 -
hdu 4699 Editor 伸展树 treap复习
题意:对一个数列进行操作,光标位置后面插入一个权值为x的数,删除光标前的那个数,光标左移一位,光标右移一位,求1到k位置的最大的前缀和。。注意这里的k是在光标之前的,由于这个条件,所以这题又简单的2个栈维护可以解,如果没有这个条件,那么就要用伸展树了。之前写过这题题解,数组的splay和栈都写过 以前的链接其它操作都没问题,这里主要讲讲 询问操作。对于操作Q x:相原创 2014-01-29 23:34:34 · 1491 阅读 · 0 评论 -
可持久化线段树入门题 hdu2665 求区间第k小的数
注意:这题题意写错了,不是区间第k大,而是区间第k小, WA了一地,看了discuss才知道,坑啊参考了clj的论文《可持久化数据结构研究》,具体做法论文里很明确。其实思想还是建多颗线段树,只是把这些线段树数据不相同的部分另外建了一些节点。对于m个询问,每次要建log(n)的节点,需要 n*2+mlog(n)的内存,这题写得不好数组就开不下了#include #inc原创 2013-09-16 20:26:01 · 2711 阅读 · 1 评论 -
treap模板(set,map,multiset, 可持久化treap)
全部模板:https://github.com/9974/DataStructures/tree/master/treap以前treap学得不怎么扎实,最近用重新温习了一下。写法不同,它能实现set,map,multiset等不同的功能。与STL相比增加的功能就是:1.求第k大的数, 2.求一个数v是第几大的数 等等功能学了能可持久化的treap原创 2014-01-19 23:31:02 · 2146 阅读 · 0 评论 -
hdu4453 伸展树基本题
题意:很多操作,具体题目中有图http://acm.hdu.edu.cn/showproblem.php?pid=4453move光标操作,move1, move2, 我们假定伸展树的第一个点为光标的位置,那么假如光标向后移动,我们可以把第一个数删除然后插入到整个序列的最后,同理光标向前移动也差不多,其它操作都是很常见的操作。伸展树敲的不多,花了一点时间调试,终于AC了。现在正式比赛估原创 2013-10-05 20:04:26 · 2025 阅读 · 0 评论 -
hdu 2871 Memory Control 伸展树区间合并
题意:就是对一个区间的四种操作,NEW x,占据最左边的连续的x个单元,Free x 把x单元所占的连续区间清空 , Get x 把第x次占据的区间输出来, R 清空整个区间。解法:很明显的区间合并,跟hotel那题差不多,貌似多了Free,Get操作, 我们可以用一个vector保存已经申请的区间,然后要Free x就在vector里面二分找到x所在的区间即可, Get也是二分一原创 2013-08-27 14:14:20 · 1073 阅读 · 0 评论 -
SPOJ375 QTREE 树链剖分入门
题目链接:http://www.spoj.com/problems/QTREE/入门资料:http://blog.sina.com.cn/s/blog_7a1746820100wp67.html专题训练:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=28982#overview入门资料很详细,细节自己要多想想原创 2013-12-20 12:17:02 · 1332 阅读 · 0 评论 -
Codeforces 375D 数据结构(好题中的好题, 4解)
题目链接:http://codeforces.com/problemset/problem/375/D全部代码:题意:给你一棵树n个点,m次询问(n=100000,m=100000),每个节点有一种颜色, 每次询问问你以v节点为根的子树中 满足 同一种颜色的个数>=k的 颜色有几个。方法1:显然询问要离线处理,不妨用思维简单的分块算法处理询问,原创 2014-03-25 19:38:09 · 2865 阅读 · 0 评论