[HNOI2004]宠物收养所 Bzoj1208
也是赤裸裸的Splay,和前面两题平衡树的一样,都是求最小插值。因为加了绝对值,所以往根左右两棵子树考虑。
因为在收养所里面的只能都是人或者都是宠物,所以在平衡树里面加一个TreeType表示树里面存的是什么,0就是宠物,1就是人,2就是空。如果进来的类型跟树的类型相同,那就插入节点,否则从树中找到一个差值最小的节点并删除。
删除操作很容易错,因为这个调了半天,整体上的思路就是把待删除节点提到根,然后合并左右子树。麻烦的就是一定要把跟待删除节点的联系全部切断,否则经过旋转平衡树会“很没有节操”,也就是不满足BST的性质,而且你会发现这个被删除的节点又出现了,而且有的节点六亲不认……
Splay要注意,每个操作之后都要旋转到根,这样效率差很多,一开始我把Max()和Min()中旋转的两句话给去掉了,结果TLE,加上去后明显快多了。
基本上这题还是被用来熟悉Splay,确实写了这三题对Splay就熟悉多了,哪天写Splay写的跟快排一样那就达到目的了^_^。现在习惯了把左旋右旋合并在一起的文艺青年的写法,代码短很多,就是不好理解。不过可以先背下来,就像快拍一样,到某个时候自然就顿悟了。 Read on →