LCT
zsyzClb
这个作者很懒,什么都没留下…
展开
-
洛谷P5385 [Cnoi2019]须臾幻境
一个挺有意思的题目。先把每一条边用编号当作边权,从第一条边开始扫描,用LCT维护当前的最大生成树。再用主席树记录删除的边即可。我在add函数写错了,调了好久。#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<cmath>#define ll long longusing namespace std;template<原创 2021-02-24 21:50:48 · 203 阅读 · 0 评论 -
[USACO18FEB]New Barns P
题目的意思是让我们动态维护直径。很容易得到以下两个定理:1.两棵树合并以后的直径端点是原来两棵树的四个直径端点中的两个;2.距离一个点最远的点一定是一个直径的端点。#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<cmath>using namespace std;template<typename T>inl原创 2021-02-23 17:19:17 · 178 阅读 · 0 评论 -
[TJOI2015]旅游
很容易想到要用动态树来维护。不过这一道题我被恶心了一下,主要是翻转操作会影响结果,所以应该同时维护从左到右和从右到左的结果。#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<cmath>using namespace std;template<typename T>inline void qr(T &x){原创 2021-02-23 16:16:54 · 140 阅读 · 0 评论 -
P5489 EntropyIncreaser 与 动态图
题意:动态加边,求两点间割边和割点的个数。我们可以用LCT来做:对于割边,先是要以点代边,边权1,点权0,我们发现在一个环上的边全部都不是割边,所以如果添加的边的两个端点已经联通,我们就把路径上的全部点权值设置为0.对于割点,我们动态维护圆方树,如果加一条边就会形成和环,那么就把环完全断掉,把环上的每一个点(方点和圆点)全部连在一个新的方点上。可以发现原来环上的任意两个点之间的距离都是2,所以能够保证时间复杂度。查询就输出圆点个数。#include<cstdio>#include<原创 2021-02-22 12:47:42 · 390 阅读 · 0 评论 -
[NOI2014]魔法森林
把每条边的ai从小到大排序然后不断插入每一条边,然后就是要维护是的1到n的路径中最大的bi最小首先我们肯定是要把转化成一棵树的,对于新插入的一条边,如果两个点本来就不连通,那么就直接插入,如果联通那么插入以后就会形成一个换,我们只要再把换上的最大的边删掉,这个用动态树维护即可。对于细节的处理,可以采用以点代边的做法,即多开m个点表示边(编号为n+1~n+m),插入一条边就是连接(u,n+i)和(n+i,v),边权就放在表示边的点上。#include<cstdio>#include<原创 2020-12-25 12:45:21 · 160 阅读 · 0 评论 -
LCT学习笔记(qtree4-7)
洛谷P4115 Qtree4大意:修改颜色,求最远的两个黑点的距离。lct有一个性质,就是对于一个splay辅助树来说,某个点的子树是现实的树上的连续的一段。很明显,首先要边权下放到叶子结点,col表示这个点的颜色,如果是黑色就是0,不是黑色就是负无穷而根据dp的思想,维护lmax表示一段路径到达这个点子树所在链的最下面一个点的最大值,rmax表示一段路径到达这个点子树所在链的最上面一个点的最大值,dat表示最长的路径,sum表示整个子树的边权和。然后我们用两个multiset分别来维护虚儿子的r原创 2020-12-19 17:14:24 · 205 阅读 · 1 评论 -
详解动态树(LCT)
LCT的功能动态树link-cut-tree缩写为LCT支持link(在线建边),cut(在线删边)的操作下面看看这一道题【题意】一个图,有n个点,一开始图中没有边。三种操作:Connect u v:在点u和点v之间建一条边。保证所有Connect操作不会重复建边。Destroy u v:摧毁点u到点v之间的边。保证所有Destroy操作将摧毁的是一条存在的边。Query u ...原创 2019-07-19 10:20:52 · 2302 阅读 · 1 评论