- 博客(11)
- 资源 (1)
- 收藏
- 关注
原创 伸展树学习小结
第一次碰到伸展树的题目是在天津网赛上, 比赛的时候用双向链表A掉了, 第一次碰到, 也没想去看看的。 后来又有人问我会不会伸展树, 这~, 果断要去看了= 0 =。 先去百度了一下, 伸展树是二叉排序树, 所有的操作都基于旋转操作, 旋转后可以使树变得平衡, 使得查找的的复杂度在log(n), 好像很DBL的样子。 随后去网上找了一份PDF开始学习。 PDF(ht
2012-10-03 20:02:52 577
原创 2012 ACM/ICPC 杭州赛区 A题 HDU 4453 Looploop 伸展树
这题比较裸, 一看就是伸展树。就是有些小细节要注意, 为了避免反转时, 指针变化, 我是直接先把前面一段接在后面, 这样就不会出现指针变化的问题。 敲好以后一直TLE, 调了半天, 发现添加的时候我既然还是用n来添加= =(n表示现在的结点数,最后添加一个变量tn表示到现在为止出现过的结点数)。 #include #include #include using namespace std
2012-11-14 12:01:25 994
原创 HDU 4125 Moles 树状数组 + KMP
这题的重点就在于建树, 题目读懂以后, 就会发现, 树建好以后就是一颗排序二叉树。 于是每次用树状数组二分找该节点的插入点。 树建完以后DFS得到字符串, 由于节点非常多, 于是要手写栈。 字符串得到以后就是水水的KMP直接求匹配数了。 #include #include #include using namespace std; const int N = 600007; co
2012-10-17 11:20:18 370
原创 HDU 3450 Counting Sequences 树状数组
这题和 HDU 3030 很像先写出 dp 方程, 是n ^ 2 dp 用树状数组优化 #include #include #include using namespace std; typedef long long LL; const int MOD = 9901; const int N = 100007; int sum[N]; int tmp[N]; int num[N];
2012-10-16 12:33:07 293
原创 HDU 3030 Increasing Speed Limits 树状数组
用一定的规则产生一个序列, 求这个序列的非空递增子序列的个数 这题的 dp 思路很简单 dp[i] 表示到第 i 位的数量 dp[i] = 1 + sum(dp[j]); //j 最后把 dp [i] 的和都加起来就是答案了。 不过这个是 n ^ 2 的 dp , 肯定要超时的, 于是想到每次求前面的和用树状数组。 #include #include #include
2012-10-15 16:25:59 400
原创 hdu 2475 Box (splay tree)
不错的一道题, 自己怎么也写不出来, 于是去问了风神。 把每个箱子看成一个括号, 箱子a在箱子b里面, 就是括号b在括号a里面。 这样第一组样例就变成了(【1】(【2】)【4】)【3】 (【x】表示第x个节点), 这样就有序了, 然后装进splay形成一个森林。 0 1 就变成了 ( ( ) ) 1 2 4 3 0 6 4 6 1 0就变成了 ( ( ) )
2012-10-09 20:08:22 1049
原创 hdu 4031 Attack (splay tree)
很容易想到 成功攻击次数 = 总攻击次数 - 防御次数。 然后把这两个分开处理就OK了 拿过来练习splay tree #include #include using namespace std; const int N = 20007; #define KT ch[ch[root][1]][0] int root, ch[N][2], fa[N], sz[N]; int su
2012-09-28 16:46:57 353
原创 HDU 4286 Data Handler (splay tree || 双向链表模拟)
这题是2012天津网络赛的题 比赛的时候还不会splay tree当时是用双向链表模拟过掉的 赛后听说这题是裸的splay tree, 现在就拿来练练splay tree, 还真的是超裸的splay tree, 就是结点太多, 最后输出的时候dfs会爆栈, 最后直接手写栈= 0 = , 结果pushdown函数忘记加了, 一直WA, 调了半天才发现, 弱爆了orz 这题操作很多, 不过都不难
2012-09-26 10:08:08 430
原创 POJ 3580 SuperMemo (SPLAY TREE)
这道题的操作非常多 ADD操作和REVERSE操作一样, 把区间变成子树, 然后直接加标记就可以了 REVOLVE 看起来很厉害, 稍微分析一下就可以得出其实就是把区间后面的一部分和放到前面一部分的前面 INSERT 操作可以把插入点之前的结点转到根结点, 插入点之后的结点转到根节点下面, 这样插入的位置就一定是根节点右儿子的左儿子(方便操作, 人为给splay tree加上两个端点结点)
2012-09-26 09:55:38 395
原创 HDU 3436 Queue-jumpers(splay tree)
题意:一开始n个人排除一队, 从1~n, 有三种操作:TOP 把第x个人换到最前面;Query输出第x个人的位置;Rank输出第x个位置的是哪个人。 思路:由于N非常大, 很自然想到先离散化,这题的难点主要就在这里了, 离散化处理得好, 下面就好办了 。 这题要把Top 和Query离散化(这两个的x都表示人), 然后记录区间最左边的人是谁, 记录最右边的人是谁, 然后要改下pushup函数不再
2012-09-24 21:16:09 437
原创 HDU 3487 Play with Chain
这道题是我用伸展树A掉的第一道题, 题目意思很简单:有n个数, 两个操作, CUT a b c把第a~b的数取出来, 然后放在新的序列的第c个数后面;FLIP a b, 把区间a到b反转。一系列操作之后输出最后的序列。 对于CAT 操作: 可以先把区间第a-1个数旋转到根节点, 然后再把b + 1旋转到根节点下, 这样区间[a, b]就变成了一颗子树, 接下来只要把这整棵子树拿下, 放在新的序列
2012-09-24 20:51:12 337
hdoj1006思路+代码
2012-02-17
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人