随笔分类 -  数据结构 - Link-Cut-Tree (LCT)

摘要:和之前那个 【LNOI】LCA 几乎是同一道题,就是用动态树来维护查分就行. code: #include <bits/stdc++.h> using namespace std; #define N 50006 #define mod 998244353 #define ll long long 阅读全文
posted @ 2019-11-29 10:44 EM-LGH 阅读(126) 评论(0) 推荐(0)
摘要:犯傻了,想到了如果是 0->1 的话就找最深的非 1 编号,是 1 -> 0 的话就找最深的非 0 编号. 但是没有想到这个东西可以直接维护. 假设不考虑叶子节点,那么如果当前点的值是 1 的话要求儿子节点权和 > 1 假设当前从 0->1,那么该叶子造成的影响一定是一条向上的链. 如果向上走到某一 阅读全文
posted @ 2019-11-28 20:15 EM-LGH 阅读(154) 评论(0) 推荐(0)
摘要:最近学了一下线段树分治,感觉还蛮好用... 如果正常动态维护最大生成树的话用 LCT 就行,但是这里还有时间这一维的限制. 所以,我们就把每条边放到以时间为轴的线段树的节点上,然后写一个可撤销 LCT 就好了 ~ code: #include <bits/stdc++.h> #define RM 3 阅读全文
posted @ 2019-11-27 12:21 EM-LGH 阅读(171) 评论(0) 推荐(0)
摘要:我们发现正着枚举删除哪些叶子是错的,但是贪心枚举留下哪些却是对的. 我们枚举的时候需要动态查一个点到根有几个点没染色,和动态染色. 支持这些操作的数据结构非 LCT 莫属 code: #include <bits/stdc++.h> #define N 1000004 #define lson t[ 阅读全文
posted @ 2019-11-10 18:35 EM-LGH 阅读(119) 评论(0) 推荐(0)
摘要:联赛前练练码力. code: #include <vector> #include <cstdio> #include <cstring> #include <algorithm> #define N 200006 #define ll long long #define lson t[x].ch[ 阅读全文
posted @ 2019-11-10 10:59 EM-LGH 阅读(264) 评论(0) 推荐(0)
摘要:没啥难的,inf 的值设小了调了半天~ code: 阅读全文
posted @ 2019-10-29 18:23 EM-LGH 阅读(141) 评论(0) 推荐(0)
摘要:维护信息的方式十分巧妙~ 维护每一棵 splay 中深度最浅,深度最深的点距离最近的白点. 这样非常方便维护,进行区间合并,进行子树维护 很多时候在维护东西的时候最大/最小/深度最小/深度最大会相对容易维护,所以如果用树剖/LCT维护信息时发现很难维护的话可以采用这种套路. 因为动态树是可以维护子树 阅读全文
posted @ 2019-10-14 16:49 EM-LGH 阅读(143) 评论(0) 推荐(0)
摘要:题意:给定一张图,保证 $1$ 号点到其他所有点的最短路径是唯一的,求:对于点 $i$,不经过 $1$ 到 $i$ 最短路径上最后一条边的最短路. 题解:可以先建出最短路树,然后枚举每一条非树边. 对于一条非树边,影响的只是 $(u,lca)$,$(lca,v)$ 这些点的答案,然后你发现可以写成 阅读全文
posted @ 2019-10-14 14:03 EM-LGH 阅读(119) 评论(0) 推荐(0)
摘要:如果做过起床困难综合征的话应该很快就能有思路,没做过那道题的话还真是挺费劲的. 我们不知道要带入的值是什么,但是我们可以知道假设带入值得当前位为 $1$ 时这一位在经过位运算后是否为 $1$. 至于这个怎么维护,我们开两个变量 $f0,f1$ 代表初始带入全 $0$,全 $1$ 时每一位得值. 然后 阅读全文
posted @ 2019-10-10 16:08 EM-LGH 阅读(170) 评论(0) 推荐(0)
摘要:这个还是比较好理解的. 你考虑如果所有边构成一棵树的话直接用 LCT 模拟一波操作就行. 但是可能会出现环,于是我们就将插入/删除操作按照时间排序,然后依次进行. 那么,我们就要对我们维护的生成树改变一下定义:生成树中的每一条边都是关键边,且要求两点间关键边的最小值最大. 什么边能成为关键边?就是这 阅读全文
posted @ 2019-09-30 14:01 EM-LGH 阅读(249) 评论(0) 推荐(0)
摘要:挺好的一道题. 假设连了 $i$ 条边且恰好连成了一棵树. 那么下一条连边有 3 种情况:1.连接两个不连通的点. 2.连接的两个点联通,且能构成奇环. 3.连接的两个点联通,能构成偶环. 对于情况1,直接将两个点相连即可. 对于情况2,显然这个奇环存在的时间为 $[s_{i+1},\min_{E 阅读全文
posted @ 2019-09-30 08:04 EM-LGH 阅读(189) 评论(0) 推荐(0)
摘要:把之前写的版本改了一下,这个版本的更好理解一些. 特地在一个链的最底端特判了一下. code: #include <bits/stdc++.h> #define N 200005 #define ll long long #define inf 10000000005 #define lson p[ 阅读全文
posted @ 2019-09-28 10:10 EM-LGH 阅读(204) 评论(0) 推荐(0)
摘要:联通块个数等于 $n$ 减掉关键边个数. 这里定义关键边为:能连接两个连通块的边. 由于强制在线,我们考虑用一种数据结构维护以 $r$ 为右端点的答案. 考虑已经构建好 $1$ ~ $r-1$ 的图,那么假如 $r$ 时分两种情况: 1. $r$ 连接的两个点没有联通,那么就将这两个点连上. 2. 阅读全文
posted @ 2019-09-25 23:21 EM-LGH 阅读(201) 评论(0) 推荐(0)
摘要:神犇学弟说LCA要用LCT求,于是我就听他的话写了一个LCT~ Code: 阅读全文
posted @ 2019-09-25 14:14 EM-LGH 阅读(218) 评论(0) 推荐(0)
摘要:建10棵动态树就完事了~ 阅读全文
posted @ 2019-09-25 08:42 EM-LGH 阅读(142) 评论(0) 推荐(0)
摘要:感觉码力严重下降~ 阅读全文
posted @ 2019-09-24 20:21 EM-LGH 阅读(154) 评论(0) 推荐(0)
摘要:挺好想的,最简单的方法是并查集启发式合并,加暴力跳父亲。 然而,这个代码量比较小,比较好写,所以我写了 LCT,更具挑战性。 阅读全文
posted @ 2019-08-29 20:54 EM-LGH 阅读(201) 评论(0) 推荐(0)
摘要:首先,一个神奇的结论:一个合法的方案存在的条件是每一个联通块的节点数都是偶数个的. 这个可以用数学归纳法简单证一证. 证出这个后,我们只需动态加入每一个边,并查看一下有哪些边能够被删除(删掉后联通块依然合法). 对于维护加边,删边,我们用动态树. 对于枚举哪些边可以被删,我们可以用堆/set来维护. 阅读全文
posted @ 2019-08-27 14:41 EM-LGH 阅读(263) 评论(0) 推荐(0)
摘要:用结构体存变量好像确实能提高运行速度,以后就这么写数据结构了 Code: 阅读全文
posted @ 2019-08-13 08:33 EM-LGH 阅读(166) 评论(0) 推荐(0)
摘要:可以作为 LCT 维护子树信息的模板,写的还是比较优美的. 本地可过,bzoj 时限太紧,一直 TLE 阅读全文
posted @ 2019-07-06 16:49 EM-LGH 阅读(266) 评论(0) 推荐(0)