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 ...
随机推荐
- JavaScript 中 this 的详解
this 的指向 this 是 js 中定义的关键字,它自动定义于每一个函数域内,但是它的指向却让人很迷惑.在实际应用中,this 的指向大致可以分为以下四种情况. 原文作者:林鑫,作者博客:http ...
- Hibernate学习---基本介绍+作用+配置
从今天开始重新学习(以前学的太匆忙)Hibernate,这篇文章主要就一下几点进行讲解和说明: Hibernate的基本介绍 Hibernate的作用 Hibernate基本配置 Hibernate的 ...
- Struts2学习---result结果集
这一章节主要介绍如何配置结果集,分为以下几个知识点: 结果集类型(result type) 全局结果集(global types) 动态结果集(dynamic type) 带有参数的结果集(type ...
- 关于mysql使用命令行时出现Data too long for column的解决方案:
方法一: 1,在mysql根目录下找到my.ini文件: 2:将其中sql-mode中的STRICT_TRANS_TABLES这个属性去掉: 3:重启mysql的服务(注意注销电脑不会重启mysql服 ...
- 环形进度条的实现方法总结和动态时钟绘制(CSS3、SVG、Canvas)
缘由: 在某一个游戏公司的笔试中,最后一道大题是,“用CSS3实现根据动态显示时间和环形进度[效果如下图所示],且每个圆环的颜色不一样,不需要考虑IE6~8的兼容性”.当时第一想法是用SVG,因为SV ...
- Django中Q查询及Q()对象
问题 一般我们在Django程序中查询数据库操作都是在QuerySet里进行进行,例如下面代码: >>> q1 = Entry.objects.filter(headline__st ...
- java多线程(三)-Executors实现的几种线程池以及Callable
从java5开始,类库中引入了很多新的管理调度线程的API,最常用的就是Executor(执行器)框架.Executor帮助程序员管理Thread对象,简化了并发编程,它其实就是在 提供了一个中间层, ...
- JSP EL隐含对象
JSP 内置对象 JSP EL隐含对象 描述 page pageScope page 作用域 request requestScope request 作用域 session sessionScope ...
- Vue 组件(component)之 精美的日历
公司的要求,需要开发一个精美的日历组件(IOS , 安卓, PC 的IE9+都能运行),写完后想把它分享出来,希望大家批评(). 先来个截图 代码已经分享到 https://github.com/zh ...
- SpringMvc开发步骤
1.导入基本jar包 2.在Web.xml中配置DispatcherServlet <!-- 配置 DispatcherServlet --> <servlet> <se ...