Link-Cut-Trees
填坑,填坑,填坑……
开篇镇人品……下文的比喻仅供娱乐……
为了迎接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的更多相关文章
- Codeforces Round #339 (Div. 2) A. Link/Cut Tree 水题
A. Link/Cut Tree 题目连接: http://www.codeforces.com/contest/614/problem/A Description Programmer Rostis ...
- [CodeForces - 614A] A - Link/Cut Tree
A - Link/Cut Tree Programmer Rostislav got seriously interested in the Link/Cut Tree data structure, ...
- B - Link/Cut Tree
Problem description Programmer Rostislav got seriously interested in the Link/Cut Tree data structur ...
- 614A - Link/Cut Tree 数乘
A. Link/Cut Tree time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- 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 ...
- link cut tree 入门
鉴于最近写bzoj还有51nod都出现写不动的现象,决定学习一波厉害的算法/数据结构. link cut tree:研究popoqqq那个神ppt. bzoj1036:维护access操作就可以了. ...
- Link/cut Tree
Link/cut Tree 一棵link/cut tree是一种用以表示一个森林,一个有根树集合的数据结构.它提供以下操作: 向森林中加入一棵只有一个点的树. 将一个点及其子树从其所在的树上断开. 将 ...
- 洛谷P3690 Link Cut Tree (模板)
Link Cut Tree 刚开始写了个指针版..调了一天然后放弃了.. 最后还是学了黄学长的板子!! #include <bits/stdc++.h> #define INF 0x3f3 ...
- LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)
为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...
- bzoj2049 [Sdoi2008]Cave 洞穴勘测 link cut tree入门
link cut tree入门题 首先说明本人只会写自底向上的数组版(都说了不写指针.不写自顶向下QAQ……) 突然发现link cut tree不难写... 说一下各个函数作用: bool isro ...
随机推荐
- VisualVM 分析full GC问题记录
背景:JAVA APP,主要功能是处理日志并存入db 现象:运行一段时间就出现OOM问题,查看GC log发现运行没多久就一直Full GC,并且抛出OOM的异常. [Full GC (Ergonom ...
- [array] leetcode - 54. Spiral Matrix - Medium
leetcode-54. Spiral Matrix - Medium descrition GGiven a matrix of m x n elements (m rows, n columns) ...
- c语言库函数测试
1.函数名: abort功 能: 异常终止一个进程用 法: void abort(void);程序例: #include <stdio.h> #include <stdlib.h ...
- h5 喜帖
地址:http://139.196.27.185:8088/ 因为国庆结婚,需要邀请亲朋好友,网上找了些电子请帖,但大都要收费,贵的还有好几百,有的效果还不太好.于是花了些时间自己写了一个. 就是sw ...
- 虚拟机创建流程中neutron代码分析(三)
前言: 当neutron-server创建了port信息,将port信息写入数据库中.流程返回到nova服务端,接着nova创建的流程继续走.在计算节点中neutron-agent同样要完成很多的工作 ...
- inode 详解
1.inode 解析: 存储文件元信息(文件创建者,创建日期,大小等)的区域叫做inode即 索引节点. 2.inode 内容: 文件字节数.拥有者UserID,GroupID,读写执行权限,时间戳, ...
- 重启网络服务时 Bringing up interface eth0
重启网络服务时报错: Bringing up interface eth0: Error:Connection activation failed:Device not managed by Net ...
- Anti-pattern/反模式
常见的与"直觉"相背离的anti-pattern产生的实际原因是没有深入.全面地考虑问题,即只关注到自己关心的方面,忽略了其他重要的.起相反作用的因素. 所以这个"直 ...
- Spring基础篇——Spring容器和应用上下文理解
上文说到,有了Spring之后,通过依赖注入的方式,我们的业务代码不用自己管理关联对象的生命周期.业务代码只需要按照业务本身的流程,走啊走啊,走到哪里,需要另外的对象来协助了,就给Spring说,我想 ...
- python如何进行内存管理
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 语言的内存管理是语言设计的一个重要方面.它是决定语言性能的重要因素.无论是C语言的 ...