树上数据结构——LCT】的更多相关文章

目录 树上数据结构--LCT 概述 基本概念 核心操作 其他操作 完整模板 树上数据结构--LCT 概述 LCT是一种强力的树上数据结构,支持以下操作: 链上求和 链上求最值 链上修改 子树修改 子树求和 换根 断开树上一条边 连接两个点,保证连接后仍然是一棵树. 基本概念 LCT是对树的实链剖分,即把所有边划分为实边和虚边 类似于重链剖分,每个点连向子节点中的实链至多只会有一条,把这条实边连向的儿子叫做实儿子 把一些实边连接的点构成的链叫做实链,容易发现实链之间没有共同点 需要注意的是一个不在…
自闭集训 Day5 树上数据结构 前置知识 点分治 边分治 树链剖分 LCT Top Tree LCT时间复杂度 线段树每次查询是严格\(\log n\)的,然而splay维护连续段的时候,如果每次查询可以缩点,那么访问的区间数是均摊\(O(1)\)的.(??) 所以用splay维护LCT是一个log,而线段树维护就是两个log. 捉迷藏 边分治多好,干什么点分治-- 每个点开个堆维护子树最远点.开个堆维护儿子最远点的前二大的值.开个堆维护全局最大值,然后随便搞. 边分治由于每次只需要合并两个子…
模板—数据结构—LCT Code: #include <cstdio> #include <algorithm> using namespace std; #define N 300010 int fa[N],son[N][2],size[N],n,m;long long sum[N],num[N]; bool rev[N]; bool check(int p) {return son[fa[p]][1]==p;} bool isroot(int p) {return son[fa…
1.总览 LCT 链分治(树剖) 点/边分治 2.点分治 一棵树,点有\(0/1\),多次修改,询问最远的两个\(1\)距离. 建出点分树,每个子树用堆维护:①最远的\(1\)距离:②它的每个儿子的①堆顶: 全局维护每棵子树②堆最大的两个值,每次修改暴力改就可以. 时间复杂度\(O(n \log^2n)\)(基本动态点分都是\(\log^2\)以上的复杂度--然而仍然随便过\(10^5\),小常数可能性微存?). 一棵树,点有点权,每次询问距离一个点不超过\(k\)的点权和. 每个点维护一个深度…
FBI Warning:本文含有大量人类的本质之一. 你经历过绝望吗? [ZJOI2007]捉迷藏 询问树上最远黑点对. 动态边分治可以比点分治少一个 \(\log\). bzoj3730 咕了. [ZJOI2015]幻想乡战略游戏 动态维护一棵树的带权重心.每个点度数 \(\le 20\). 暴力:从根往最重的跳,能跳就跳. 动态点分治加速即可. 边分治?链分治? 边分治和点分治很像,找一条边使得剩下部分尽量平衡. 不过直接这样会被菊花图卡掉. 然后就要--用某些方法变成二叉树. 咕了.这么重…
这个题的思路非常好啊. 我们可以把 $k$ 个点拿出来,那么就是求将 $k$ 个点划分成不大于 $m$ 个集合的方案数. 令 $f[i][j]$ 表示将前 $i$ 个点划分到 $j$ 个集合中的方案数. 那么有 $f[i][j]=f[i-1][j-1]+f[i-1][j]*(j-fail[i])$,其中 $fail[i]$ 代表 $i$ 到根这条路径上祖先数量. 而 $fail[i]$ 的求解方式有:虚数统计/树上数据结构维护路径和,这里选择了用 LCT 来维护. code: #include…
## 本蒟蒻的小整理qwq--持续更新(咕咕咕) 数据结构 数据结构 知识点梳理 数据结构--线段树 推荐yyb dalao的总结--戳我 以后维护线段树还是把l,r写到struct里面吧,也别写len了,调试不好调qwq 初始化和叶节点初始化不太一样qwq,有的需要统一初始化的就一定注意不要写到if(l==r)里面qwq 求区间最大子段和 例题:codevs动态最大子段和 维护区间和,区间前缀最大子段和,区间后缀最大子段和,区间最大子段和.然后合并.(注意这种跨左右子树还有可能会有贡献的线段树…
Day_1 计数 它咕掉了 Day_1 序列数据结构 它咕掉了 Day_2 线性代数 高斯消元\Large{高斯消元}高斯消元 普通版:略 模质数:求逆 模合数:exgcd 逆矩阵\Large{逆矩阵}逆矩阵 AA−1=I=[10⋯001⋯0⋮⋮⋱⋮00⋯1] AA^{-1}=I=\left[ \begin{matrix} 1 & 0 & \cdots & 0 \\ 0 & 1 & \cdots & 0 \\ \vdots & \vdots &…
2555: SubString Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 1936  Solved: 551[Submit][Status][Discuss] Description 懒得写背景了,给你一个字符串init,要求你支持两个操作    (1):在当前字符串的后面插入一个字符串    (2):询问字符串s在当前字符串中出现了几次?(作为连续子串)    你必须在线支持这些操作. Input 第一行一个数Q表示操作个数    第二行一…
二轮省选前的最后一周了呢. 一路走到这里,真的很希望能继续走下去. 好好调整一下状态,争取能有机会买D吧(虽然现在似乎D也没什么用了 day1 多项式 多项式ln 多项式exp day2 数据结构 LCT 可持久化数据结构 day3 图论+dp 2-sat 圆方树 数位DP meet in the middle day4 网络流+字符串 SA manacher day5 计算几何 扫描线 半平面交 皮克定理 闵可夫斯基和 day6 数论 polya mobius 欧拉定理ext 找一天抽出时间模…
题目 描述 ​ 有两棵树\(T\)和\(T'\),节点个数都为\(n\),根节点都为\(1\)号节点; ​ 求两两点之间 $$ \begin{align} depth(x) + depth(y) - depth(LCA(x,y)) - depth'(LCA'(x,y)) \end{align} \ 其中depth(x)为x和1号节点的树上距离 \ $$ ​ 的最大值: 范围 ​ $1 \le n \le 366666 $ : 题解 原式 = \(\frac{(dep(x) + dep(y) +…
$QTREE$ 就是一套树上数据结构练习题. 这套题貌似来源于 $SPOJ$,我是在 $luogu$ 看到的. $QTREE1$ 题意 一棵 $n$ 个点的带边权树,要求支持 单边改权值 和 询问路径边权和. 题解 树链剖分裸题. $QTREE2$ 题意 一棵 $n$ 个点的带边权树,有两种询问,分别是 询问路径边权和.询问有向路径的第 $k$ 个点. 题解 还是树链剖分裸题,由于没有修改,直接维护每条重链缩起来的信息即可,方便一次跳过重链. $QTREE4$ 题意 一棵 $n$ 个点的带边权树…
FBI Warning:以下博客含有 FBI Warning 的都是包含大量人类本质之一的. 前几天听课: Day1 组合计数 Day1 序列数据结构 Day2 线性代数 Day3 图论 Day3 字符串 Day4 生成函数 Day4 树上数据结构 Day5 杂题选讲 Day5 计算几何 Day6 离线问题 Day6 DP 后几天十连测:(以下内容均有 FBI Warning) Day1 Day2 Day3 Day4 Day5 Day6 Day7 Day8 Day9 Day10…
Codeforces 题面传送门 & 洛谷题面传送门 树上数据结构大杂烩(?) 首先考虑什么样的点能够在所有路径的 \(d\) 邻居的交集内.显然如果一个点在一条路径的 \(d\) 邻居内则必须有该点到这条路径上所有点中最近的点的距离 \(\le d\),因此一个点在所有路径 \(d\) 邻居的交集内,当且仅当对于所有路径,该点到该路径上点距离的最小值的最大值 \(\le d\),我们即需判定是否存在这样的点. 直接维护显然不容易,不过我们思考这样一个问题:是否存在一个点,满足只要所有路径的 \…
ZROI 游记 在自闭中度过了17天 挖了无数坑,填了一点坑 所以还是有好多坑啊zblzbl 挖坑总集: 时间分治 差分约束 Prufer序列 容斥 树上数据结构 例题C (和后面的例题) 点分 最大流.费用流.上下界 Hero meet devil(dp套dp) Pollards' Rho CRT & exCRT BSGS & exBSGS NTT & FFT 以及 分治NTT & FFT (& 原根) Cipolla 算法(二次剩余) Min25 ZROI D1…
HDU4010 类比静态区间问题->动态区间问题的拓展 我们这里把区间变成树,树上的写改删查问题,最最最常用LCT解决 LCT用来维护动态的森林,对于森林中的每一棵树,用Splay维护. LCT是把这些Splay关联在一起的数据结构 我们以HDU4010为例子 int n,m,cnt,top; bool rev[maxn]; int mx[maxn],fa[maxn],v[maxn],tag[maxn],last[maxn],q[maxn]; ]; ]; 这里把树存成了图,邻接表表示,对于森林中…
#1.0 简述 #1.1 动态树问题 维护一个森林,支持删除某条边,加入某条边,并保证加边.删边之后仍然是森林.我们需要维护这个森林的一些信息. 一般的操作有两点连通性,两点路径权值和等等. #1.2 实链剖分 先来回顾一下树链剖分,我们可以按照子树大小进行剖分(重链剖分),也可以按照子树高度进行剖分(长链剖分),使得原本的一棵树被分为若干条链,然后可以在链上通过如线段树这样的数据结构维护信息. 那么,存不存在一种剖分方式能够使我们更加得心应手地处理动态树问题?显然剖出的可能会不停变换,于是我们…
传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=986 WZJ的数据结构(八) 难度级别:E: 运行时间限制:3000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述   给你一个N个节点的森林,从1到N编号,每个点有权值.请你设计一个数据结构,进行以下两种操作: 1.修改:给你a.b.c,将a到b路径上所有点的权值改成c. 2.增加:给你a.b.c,将a到b路径上所有点的权值增加c. 3.…
传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=983 WZJ的数据结构(七) 难度级别:C: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 给你一棵N个节点的无根树,每个点有一个权值(开始都是0).请你设计一个数据结构,完成以下功能: 给你a.b.v,请将a到b路径中的节点权值都增加v(包括a点与b点).最后输出每个节点的权值. 输入 第一行为一个正整数N.接下来…
洛谷题目传送门 思路分析 最简单粗暴的想法,肯定是大力LCT,每个树都来一遍link之类的操作啦(T飞就不说了) 考虑如何优化算法.如果没有1操作,肯定每个树都长一样.有了1操作,就来仔细分析一下对不同树的影响. 假设有一个1操作形如\(l\ r\ x\),那么从微观来看差异,我们只关注第l-1棵树和第l棵树.再假设以后都没有了0操作,那么我们可以认为,第l棵树是第l-1棵树把这个1操作以后嫁接在原来生长节点上的所有节点(以及所有子树)全部转而嫁接到x上.再看第r棵树和第r+1棵树,是不是可以认…
题目描述 给出一棵n个节点的树,每一个节点开始有一个互不相同的颜色,初始根节点为1. 定义一次感染为:将指定的一个节点到根的链上的所有节点染成一种新的颜色,代价为这条链上不同颜色的数目. 现有m次操作,每次为一下三种之一: RELEASE x:对x执行一次感染: RECENTER x:把根节点改为x,并对原来的根节点执行一次感染: REQUEST x:询问x子树中所有节点感染代价的平均值. 输入 输入的第一行包含两个整数n和m,分别代表局域网中计算机的数量,以及操作和询问的总数.接下来n-1行,…
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是算法与数据结构的第15篇,也是动态规划系列的第4篇. 之前的几篇文章当中一直在聊背包问题,不知道大家有没有觉得有些腻味了.虽然经典的文章当中背包一共有九讲,但除了竞赛选手,我们能理解到单调优化就已经非常出色了.像是带有依赖的背包问题,和混合背包问题,有些剑走偏锋,所以这里不多做分享.如果大家感兴趣可以自行百度背包九讲查看,今天我们来看一个有趣的问题,通过这个有趣的问题,我们来了解一下在树形结构当中做动态规划的方法. 这个问题题意很…
本文由TechFlow原创,本博文仅作为知识点学习,不会用于任何商业用途! 今天我们来看一个有趣的问题,通过这个有趣的问题,我们来了解一下在树形结构当中做动态规划的方法. 这个问题题意很简单,给定一棵树,并不一定是二叉树,树上的树枝带有权重,可以看成是长度.要求树上最长的链路的长度是多少? 比如我们随手画一棵树,可能丑了点,勿怪: 如果让我们用肉眼来看,稍微尝试一下就能找到答案,最长的路径应该是下图当中红色的这条: 但是如果让我们用算法来算,应该怎么办呢? 这道题其实有一个非常巧妙的办法,我们先…
这可真是道神仙题QWQ问了好多\(dalao\)才稍微明白了一丢丢做法 首先,我们假设不存在\(1\)操作,那么对于询问的一段区间中的所有的树,他们的形态应该是一样的 甚至可以直接理解为\(0\)操作就是表示所有树的生成节点都添加一个儿子 其实就算存在\(1\)操作,也是类似同理的. 这样考虑: 考虑如果在 \(l\)处更换了生长节点,那么就相当于把第 \(l−1\) 棵树之后生长的节点都"嫁接"在这个新的生长节点上.我们可以想象对于每一个\(1\)操作建一个虚点,然后0操作生长的点都…
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 12266  Solved: 4945[Submit][Status][Discuss] Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成 一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: 询问从点u到点v的路径上的节点的最大权值…
模板,也可以用树链剖分+线段树做O(nlog2)O(nlog^2)O(nlog2) 用LCT做O(nlog)O(nlog)O(nlog)在乘上一个大于30的常数-然后LCT比树剖慢一倍- CODE #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long LL; template<typename T>inline void…
Description 点数<=100000,操作数<=200000 Solution 经典的LCT维护子树路径信息的问题. 具体来说,我们对于每一个节点,它在splay上的子树对应了原树中的一条祖先后代链(换过根的),记录这个点的splay子树中的所有黑点以及它们的虚子树中的所有黑点分别到这条祖先后代链的链顶和链底的0次,1次,2次距离和,另外记录splay的子树的所有虚儿子到这条链的答案. update相当于是合并两条链,以到链顶为例,左半边直接加,右半边每个的距离要多左子树的大小,利用\…
前置芝士:Here 本文是基于 OI wiki 上的文章加以修改完成,感谢社区的转载支持和其他方面的支持 树形 DP,即在树上进行的 DP.由于树固有的递归性质,树形 DP 一般都是递归进行的. 基础 以下面这道题为例,介绍一下树形 DP 的一般过程. 例题 洛谷 P1352 没有上司的舞会 题目描述 某大学有 $n$ 个职员,编号为 $1 \sim N$.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员都会增加一…
题解:主席树&DFS序. PS:为什么我一开始Wa了N发 是因为有一个左区间我写成[L,M+1]了.......................... #include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<queue> #include<cstring> #define PAU putchar(' ') #define…
动态树是一类要求维护森林的连通性的题的总称,这类问题要求维护某个点到根的某些数据,支持树的切分,合并,以及对子树的某些操作.其中解决这一问题的某些简化版(不包括对子树的操作)的基础数据结构就是LCT(link-cut tree). LCT的大体思想类似于树链剖分中的轻重链剖分(轻重链剖分请移步http://www.cnblogs.com/BLADEVIL/p/3479713.html),轻重链剖分是处理出重链来,由于重链的定义和树链剖分是处理静态树所限,重链不会变化,变化的只是重链上的边或点的权…