摘要: 原题传送门 解题思路:裸平衡树操作,支持区间翻转即可,这里写了无旋treap。 其实平衡树的区间操作就和线段树差不多,你用个标记搞一下就好了,,,,, 阅读全文
posted @ 2017-05-08 13:24 Melacau 阅读(347) 评论(0) 推荐(0) 编辑
摘要: 最近在研究平衡树,看起来这种东西又丧水又很深,感觉很难搞清楚。在Ditoly学长的建议下,我先学习了正常的treap,个人感觉这应该是平衡树当中比较好懂的而且比较好写的一种。 然而,发现带旋treap有很多无法支持的操作,例如各种区间操作,而且由于会旋转无法可持久化,这是一个十分影响实用性的问题,在 阅读全文
posted @ 2017-05-08 10:44 Melacau 阅读(1893) 评论(3) 推荐(1) 编辑
摘要: 原题传送门 题意:给你N个带权点,一开始相互独立(每个点视为单独一个集合),有2种操作:1)合并2个集合;2)查询包含某元素集合内的权值第k小点编号。 解题思路:显然合并就是并查集,而查询则是平衡树实现。 考虑对每个集合开一棵平衡树,这样的话直接合并2棵平衡树的效率最坏是\( n \log n \) 阅读全文
posted @ 2017-05-04 09:44 Melacau 阅读(298) 评论(0) 推荐(0) 编辑
摘要: 最近开始学习平衡树,在学长的强烈推荐下学习了AVL、红黑树、splay(以上我都还没学)treap。 首先讲一下个人对treap(树堆)的理解。 treap,顾名思义,就是tree+heap,首先因为treap是一棵平衡树,因此它满足二叉排序树的性质,接下来,为了防止BST退化成一条链,它使用了随机 阅读全文
posted @ 2017-05-03 09:08 Melacau 阅读(415) 评论(0) 推荐(0) 编辑
摘要: 题目传送门 题目大意:给定一棵无根树,每个节点有自己的类别和权值,现在给定两个类别相同的点,叫你求这2点路径上同类别节点的权值和/最大权值。 节点类别与权值会改变。 解题思路:考虑对每一个类别开一棵线段树,动态开点,可以写指针,也可以开数组写链表,然后剩下的就是树剖的东西了。我写的是指针,跑的略慢一 阅读全文
posted @ 2017-04-30 17:41 Melacau 阅读(354) 评论(0) 推荐(0) 编辑
摘要: 原题传送门 题意:给你一棵树,然后有一个遍历顺序,你需要补全这个遍历顺序,然后输出这个遍历顺序中每个点的出现次数。 解题思路:本来想找树剖的题,结果发现了一题可以直接写lca的。。。。 做法1:非常简单的NOIP式做法就是tjlca后直接树上差分即可。时间效率\( O(n) \)(常数较大).(BZ 阅读全文
posted @ 2017-04-28 09:54 Melacau 阅读(228) 评论(0) 推荐(0) 编辑
摘要: 题意见试题传送门 解题思路:显然是题树剖题。 考虑用线段树维护区间端点颜色与颜色数,这样就可以方便的合并,注意查询的时候对端点的特殊处理即可。 时间效率最高为\( O (m \log^{2} n) \).(BZOJ 上 4072ms) 阅读全文
posted @ 2017-04-28 09:09 Melacau 阅读(240) 评论(0) 推荐(0) 编辑
摘要: 原题传送门 题意: 给你一棵树,有2种操作: 1.使得某个点到根节点路径上的所有点权值赋为1。 2.使得某节点的子树中所有节点权值赋为0. 每次操作要求输出权值更改的节点个数。 解题思路: 显然是用树剖来解决问题,考虑用区间赋值的线段树维护区间内1的个数,然后直接按题意树剖求解即可。 操作1的时间效 阅读全文
posted @ 2017-04-26 11:00 Melacau 阅读(203) 评论(0) 推荐(0) 编辑
摘要: 题目请自行查阅传送门。 典型的树剖题,线段树维护操作,记一下子树在线段树内范围即可。 时间复杂度:\( O(m \log^{2} n) \) 阅读全文
posted @ 2017-04-26 09:23 Melacau 阅读(152) 评论(0) 推荐(0) 编辑
摘要: 接着找树剖的题。。。传送门(点我) 题意:给你一棵无根树,有三种操作:查询树上2点路径的点权和/最大点权;更改某点的点权。 解题思路:树链剖分裸题,我采用了常数较小的zkw线段树维护剖下来的树(毕竟线段树常数太大很危险),然后就是树剖的东西解决即可。 时间复杂度:期望:\( O(n \log \lo 阅读全文
posted @ 2017-04-25 16:50 Melacau 阅读(248) 评论(0) 推荐(0) 编辑