填坑,填坑,填坑……

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

为了迎接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. VisualVM 分析full GC问题记录

    背景:JAVA APP,主要功能是处理日志并存入db 现象:运行一段时间就出现OOM问题,查看GC log发现运行没多久就一直Full GC,并且抛出OOM的异常. [Full GC (Ergonom ...

  2. [array] leetcode - 54. Spiral Matrix - Medium

    leetcode-54. Spiral Matrix - Medium descrition GGiven a matrix of m x n elements (m rows, n columns) ...

  3. c语言库函数测试

    1.函数名: abort功  能: 异常终止一个进程用  法: void abort(void);程序例: #include <stdio.h> #include <stdlib.h ...

  4. h5 喜帖

    地址:http://139.196.27.185:8088/ 因为国庆结婚,需要邀请亲朋好友,网上找了些电子请帖,但大都要收费,贵的还有好几百,有的效果还不太好.于是花了些时间自己写了一个. 就是sw ...

  5. 虚拟机创建流程中neutron代码分析(三)

    前言: 当neutron-server创建了port信息,将port信息写入数据库中.流程返回到nova服务端,接着nova创建的流程继续走.在计算节点中neutron-agent同样要完成很多的工作 ...

  6. inode 详解

    1.inode 解析: 存储文件元信息(文件创建者,创建日期,大小等)的区域叫做inode即 索引节点. 2.inode 内容: 文件字节数.拥有者UserID,GroupID,读写执行权限,时间戳, ...

  7. 重启网络服务时 Bringing up interface eth0

    重启网络服务时报错:  Bringing up interface eth0: Error:Connection activation failed:Device not managed by Net ...

  8. Anti-pattern/反模式

      常见的与"直觉"相背离的anti-pattern产生的实际原因是没有深入.全面地考虑问题,即只关注到自己关心的方面,忽略了其他重要的.起相反作用的因素. 所以这个"直 ...

  9. Spring基础篇——Spring容器和应用上下文理解

    上文说到,有了Spring之后,通过依赖注入的方式,我们的业务代码不用自己管理关联对象的生命周期.业务代码只需要按照业务本身的流程,走啊走啊,走到哪里,需要另外的对象来协助了,就给Spring说,我想 ...

  10. python如何进行内存管理

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