填坑,填坑,填坑……

开篇镇人品……下文的比喻仅供娱乐……

为了迎接JSZX校内互测,我临时填坑学了LCT……

怎么说呢……我也是懵懵懂懂地看了N篇博客,对着标程敲上一发代码,然后才慢慢理解。这里推荐Virtual Judge的一个LCT题集,挺良心的:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=25242#overview

这个题集我写了4题(另有一道用的链剖),这个博客里都可以找到代码。

相信其他资料已经说了很多LCT的定义什么的,我假定你已经看过这些,只是对具体操作有些模糊,我只说一些自己的心得。

开始啦

我们可以这么想,首先给你一颗树(或者森林),然后慢慢给你加边,删边什么的。(这个大家庭开始有一些事件,有人要加入(认亲),有人被抛弃(分家)……233)

在加边的时候,我们按每个点在树中的深度作为关键字,弄好多棵Splay(Splay不熟悉的话还是建议先补一下),Spaly可以看成一个联盟,然后在Splay上调来调去……(也就是说,这个家庭每次做出重大调整的时候,一个人被调整的时候无论如何都要带上他的儿女一起走。你爸跟你伯伯分家的时候总不会把你也塞给伯伯吧)

一开始,每棵Splay都包含一个点,大概像这样:

深色的边表示关系比较好,此时它们是一个联盟。

  我们在操作的时候,通常是要把要操作的两个点分到两棵Splay(联盟)里,然后把这两个点旋到根,再对这两个首脑进行操作就方便多了,通常情况下,作为一颗Splay的根节点,它的父亲存的是整棵Splay(映射在树中实际是一条链)的父亲(树中这条链离根最近的那个点的父亲,如果这个点已经是根,那么之间为一个特定指针,这个指针往往看你自己的代码风格,也就是爱怎么写就怎么写),删边的时候,这两棵Splay中某一棵的究极祖父(根的父亲存的指针)肯定是另一棵的根(操作合法必须这样),那么之间把这个究极祖父变成自己的空指针就好了,然后在真实的树中这个点就跟它父亲分离(好可怜),变成一棵独立的树啦。当它想家的时候,要回家了,就会带上它的整棵Splay(在此之前先让它成为联盟的首脑),然后把一个联盟并入另一个联盟就好咯。

  可以看出,Splay的合并操作要求某个根有一个空儿子,那么我们可以这么做:因为它以深度为关键字,我们在把一个点选举为首脑之前,先把比它深度大的点踢出去(好残忍……),再让它变成根它的右儿子就什么都没有了。这就是所谓的Access操作,给个代码就好了,非常好懂的。

inline void acc(int u){
int x=;
while(u){
splay(u);
rt[ch[u][]]=;//rt表示一个点是不是联盟的首脑
ch[u][]=x;
rt[ch[u][]]=;
u=fa[x=u];
}
}

然后像我刚才说的那样,link和cut操作也很好想了。

inline void re(int x){
acc(x);splay(x);rev[x]^=;
}
inline void link(int x,int y){
re(x);acc(y);
ch[y][]=x;fa[x]=y;
}
inline void cut(int x,int y){
re(x);acc(y);splay(y);
ch[y][]=fa[ch[y][]]=;
}

针对各种不同的修改操作,往往需要切换各种姿势打标记(让某个人记得告诉它儿子们某件事),其实也就是splay和acc的不同组合而已。

写得好像还是挫……

Link-Cut-Trees的更多相关文章

  1. Codeforces Round #339 (Div. 2) A. Link/Cut Tree 水题

    A. Link/Cut Tree 题目连接: http://www.codeforces.com/contest/614/problem/A Description Programmer Rostis ...

  2. [CodeForces - 614A] A - Link/Cut Tree

    A - Link/Cut Tree Programmer Rostislav got seriously interested in the Link/Cut Tree data structure, ...

  3. B - Link/Cut Tree

    Problem description Programmer Rostislav got seriously interested in the Link/Cut Tree data structur ...

  4. 614A - Link/Cut Tree 数乘

    A. Link/Cut Tree time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  5. Codeforces Round #670 (Div. 2) C. Link Cut Centroids (dfs,树)

    C. Link Cut Centroids Fishing Prince loves trees, and he especially loves trees with only one centro ...

  6. link cut tree 入门

    鉴于最近写bzoj还有51nod都出现写不动的现象,决定学习一波厉害的算法/数据结构. link cut tree:研究popoqqq那个神ppt. bzoj1036:维护access操作就可以了. ...

  7. Link/cut Tree

    Link/cut Tree 一棵link/cut tree是一种用以表示一个森林,一个有根树集合的数据结构.它提供以下操作: 向森林中加入一棵只有一个点的树. 将一个点及其子树从其所在的树上断开. 将 ...

  8. 洛谷P3690 Link Cut Tree (模板)

    Link Cut Tree 刚开始写了个指针版..调了一天然后放弃了.. 最后还是学了黄学长的板子!! #include <bits/stdc++.h> #define INF 0x3f3 ...

  9. LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)

    为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...

  10. bzoj2049 [Sdoi2008]Cave 洞穴勘测 link cut tree入门

    link cut tree入门题 首先说明本人只会写自底向上的数组版(都说了不写指针.不写自顶向下QAQ……) 突然发现link cut tree不难写... 说一下各个函数作用: bool isro ...

随机推荐

  1. Hibernate学习---单表查询

    我们都知道SQL是非常强大的,为什么这么说呢?相信学过数据库原理的同学们都深有体会,SQL语句变化无穷,好毫不夸张的说可以实现任意符合我们需要的数据库操作,既然前面讲到Hibernate非常强大,所以 ...

  2. OC学习11——循环引用与@class

    转载自 OC学习篇之---@class关键字的作用以及#include和#import的区别 一.#import和#include的区别 当我们在代码中使用两次#include的时候会报错:因为#in ...

  3. Hibernate缓存和状态

    缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能.   缓存的介质一般是内存,所以读写速度很快.但如果缓存中存放的数据量非常大时,也会用硬盘 ...

  4. 447. Number of Boomerangs

    Given n points in the plane that are all pairwise distinct, a "boomerang" is a tuple of po ...

  5. PipeHttp 测试工具使用

      以下简单介绍下参数工具的使用     GitHub地址: https://github.com/lulianqi/PipeHttp/ (工程地址) https://github.com/lulia ...

  6. android的ADK下载地址

    把下面所有的包下载到temp目录下进行安装. 用代理http://ppdaili.com/https://dl-ssl.google.com/android/repository/repository ...

  7. Linux下jira自启动设置

    jira 的启动主要依靠的是bin目录下的catalina.sh脚本,提供了如init脚本的start,stop等参数----------------------------------------- ...

  8. python如何进行内存管理

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 语言的内存管理是语言设计的一个重要方面.它是决定语言性能的重要因素.无论是C语言的 ...

  9. linux系统中,文件的三种特殊权限

    背景介绍 在linux系统中,我们熟知有rwx三种权限,对应所有者,同组用户,其他用户三种用户的权限,一共9个位来指定一个文件的权限情况,通过chmod xxx 来更改权限属性,其中xxx是已八进制表 ...

  10. IOS 看懂此文,你的block再也不需要WeakSelf弱引用了!

    前言: 最近都在折腾 Sagit 架框的内存释放的问题,所以对这一块有些心得. 对于新手,学到的文章都在教你用:typeof(self) __weak weakSelf = self. 对于老手,可能 ...