随笔分类 - 数据结构 - Link-Cut-Tree (LCT)
摘要:双指针+LCT. 在二分图那道题中,有一种用 LCT 维护奇环的方法. 该题的做法和那道题相似. 对于 $i$,维护 $left[i]$ 表示当删除 $i$ 时最靠左的端点使得删掉 $[left[i]+1,i]$ 后仍然存在奇环. 那么最后判断答案的时候就看 $(l,r)$ 中的 $l$ 是否大于
阅读全文
摘要:结论:如果边权非负,则距离树上一个点最远的点一定是直径端点之一. 由此可得我们只需维护树的直径就行. 这种维护方法的局限性在于不可以有删边操作. 假如合并两个连通块 A,B, 直径端点分别为 $x_{0},x_{1},x_{2},x_{3}$,新树直径的端点一定是在 4 个点中的两个. 那就两两取
阅读全文
摘要:第一次做交互题,感觉挺有趣的. 对于链的部分,可以随机一个点拓展,直到拓展到该点为止. 但是最坏情况下可能每次都要询问两次(每次左右端点都选错). 据说随机化情况下出错的次数大概为 $O( \log n)$ 次. 对于树的部分最暴力的做法是从根节点开始询问,暴力拓展到叶子. 假设钦定一条从根节点向下
阅读全文
摘要:神仙 DP. 可以求解 $1$ 号点的答案 $val(1)=w$. 假设所选的 $S$ 集合包含 $w$,那么答案一定为 $1$. 令叶子节点个数为 $m$,则有 $2^{m-1}$ 个集合的答案为 $1$. 假设当前修改代价为 $i$,想让根节点的答案改变. 最优改变方式有两种:1.将小于 $w$
阅读全文
摘要:圆方树模板题. 建出圆方树. 对于每个方点,只维护方点儿子的最小值,不维护方点父亲的值,这样的话每次修改只会改一个方点. 我们需要支持单点修改,链查询,求 lca. LCT 可以非常方便地维护这些东西,然后如果 lca 是方点的话特判一下方点父亲的点值即可,可以单独开一个命名空间以防止变量名冲突。
阅读全文
摘要:大大大数据结构题. 我们发现,如果 $k=2$,答案就是树的直径. 而 $k>2$ 时,相当于选择 $k$ 个叶子,使得这些叶子的并最大. 我们有一个显然的贪心:$k+1$ 的答案一定是在 $k$ 的答案上加一个叶子. 如果不考虑修改,这其实就是长链剖分. 即 $k$ 时的答案就是大小为前 $k$
阅读全文
摘要:好神仙的数据结构题呀! code: #include <cstdio> #include <cstring> #include <vector> #include <cmath> #include <algorithm> #define BL 250 #define N 100006 #define
阅读全文
摘要:用 LCT 维护颜色相同连通块,然后在线段树上查一下逆序对个数就可以了. code: #include <cstdio> #include <algorithm> #include <cstring> #include <string> #define N 100005 #define ll lon
阅读全文
摘要:A - Sasha and a Bit of Relax code: #include <cstdio> #include <map> #include <cstring> #include <algorithm> #define N 300006 #define ll long long #def
阅读全文
摘要:挺厉害的一道大数据结构题. 由于 LCT 是维护树的形态的,所以说不支持翻转操作. 而在维护序列时 splay 是支持区间翻转的. 所以,我们对于 LCT 中每一个重链都维护一个 splay(这个不同于 LCT 中的 splay) 由于重链是一个序列,所以是支持序列的区间翻转的. 那么我们的翻转,链
阅读全文
摘要:Description H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构。伸展树(splay)是一种数据 结构,因为代码好写,功能多,效率高,掌握这种数据结构成为了 H 国的必修技能。有一天,邪恶的“卡”带着 他的邪恶的“常数”来企图毁灭 H 国。“卡”给 H 国的人洗脑说
阅读全文
摘要:题意:给定一棵树,每次钦定一个点为根,求以这个点为根时每个点子树权和平方之和,有单点修改. 虽然有修改,但是没有换根操作(等于说每次询问时只换依次根) 我们初始的时候不妨令 $1$ 为根,并考虑当根为 $x$ 时与根为 $1$ 时的差别. 我们发现,当根为 $x$ 时,子树权和发生改变的只是 $1$
阅读全文
摘要:维护 $\sum_{}v[i]\times dep[i]$ 与 $\sum_{} v[i]\times dep[i]^2$ 其中 $dep[i]$ 表示 $i$ 点在该点所在 $LCT$ 的 $splay$ 中的中序遍历序. 然后正着维护一个,反着维护一个就行了. #include <cstdio>
阅读全文
摘要:这个和 QTREE5 的套路是一样的,就是维护一个深度最深/浅的距离和,然后合并一下就好了. code: #include <map> #include <string> #include <cstdio> #include <cstring> #include <algorithm> #defin
阅读全文
摘要:注意:$LCT$ 在 $link$ 的时候必须要 makeroot. 假如要将 $y$ 连到 $x$ 上: 如果只是将 $y$ Access 并 splay 然后直接连到 $x$ 上的话你会发现 $y$ 在 $splay$ 中所有左儿子其实都在 $(x,y)$ 之间,而这显然就不对了. code:
阅读全文
摘要:这道题的思路很神啊 ~ #include <cstdio> #include <string> #include <cstring> #include <algorithm> using namespace std; const int N=200006; int cur_id; namespace
阅读全文
摘要:这个题的思路非常好啊. 我们可以把 $k$ 个点拿出来,那么就是求将 $k$ 个点划分成不大于 $m$ 个集合的方案数. 令 $f[i][j]$ 表示将前 $i$ 个点划分到 $j$ 个集合中的方案数. 那么有 $f[i][j]=f[i-1][j-1]+f[i-1][j]*(j-fail[i])$,
阅读全文
摘要:思路并不难,主要是细节需要注意一下. 在 lct 中,删边要写成:f[lson]=0,lson=0 (因为删 x->y 时 y 不一定是左儿子,y 只是 x 的前驱) 然后 f[lson]=lson=0 这个写法在一些编译器上是错误的(就是你会发现 f[lson] 中这个 lson 会变成 0 )
阅读全文
摘要:自己独立想出来的,超级开心 一开始想的是对于每一个点分别算这个点对答案的贡献. 但是呢,我们发现由于每一条路径的贡献是该路径颜色种类数,而每个颜色可能出现多次,所以这样就特别不好算贡献. 那么,还是上面那句话,由于算的是颜色种类,所以我们可以对每一个颜色种类单独算贡献. 即不以点为单位去算,而是以颜
阅读全文
摘要:自己 yy 了一个动态 dp 做法,应该是全网唯一用 LCT 写的. code: #include <bits/stdc++.h> #define ll long long #define lson tr[x].ch[0] #define rson tr[x].ch[1] #define setIO
阅读全文

浙公网安备 33010602011771号