摘要:
HDU_1512 这个题目用左偏树做的居多,昨天晚上突然想到其实用一棵splay也能方便的实现合并的操作,于是就用splay写了。 在fight之前,要先找到两棵树中的最大值,然后splay到根部并修改。之后为了实现合并,可以将一棵splay“最右边”的元素splay到根部,这样根的右子树就为空了,直接把另一棵树放到这个位置即可。#include<stdio.h>#include<string.h>#define MAXD 100010#define INF 0x7fffffffint N;struct Splay{ int pre, ls, rs, key, max; 阅读全文
posted @ 2012-06-17 11:34
Staginner
阅读(377)
评论(0)
推荐(0)
摘要:
HDU_4010 这个题目由于需要Cut和Join,所以需要用link-cut-tree来写。 无论是Cut还是Join,都涉及到一个基本的操作,就是把一个节点变成根(makeroot),如果能把makeroot这个操作写成功的话,Cut和Join就比较好完成了。 实际上在进行access(x)的操作之后,如果我们想将x作为根,只需要将这条路径上的边的父子关系都“反向”即可,那么便只要将x旋转到根,然后将这棵splay以及其子树上左右儿子的位置交换,也就是打一个rev(reverse)的标记就可以了。 此外,对于一些细节也需要注意,比如某些操作中x如果和y相等的话是否需要特判一下。#inclu 阅读全文
posted @ 2012-06-17 00:56
Staginner
阅读(464)
评论(0)
推荐(0)
浙公网安备 33010602011771号