树链剖分
_beginend
这个作者很懒,什么都没留下…
展开
-
【牛客多校20210717 Cut the Tree】【长链剖分】
(我是superguymj,因为没有blog,所以就发到这来了。感谢beginend的友情铺位)简单题意给一颗树,定义 f(x)f(x)f(x) 为删除点 xxx 后的森林的树上最长上升子序列,求最小的 f(x)f(x)f(x)。题解题解看不懂,时间复杂度还劣,所以自己写一篇。首先考虑如何算子树内的树上最长上升子序列。经典做法是维护一个上升和下降的单调栈,每次合并就是把两个单调栈点积取 min/max。注意单调栈的长度是 O(depth)O(depth)O(depth) 的,所以长剖即可。复杂度原创 2021-07-20 21:16:28 · 406 阅读 · 2 评论 -
【hdu 6634 Salty Fish】【最小割+长链剖分】
题意给一棵nnn个节点的有根树,点有点权。有mmm个摄像机,第iii个摄像机会覆盖到以xix_ixi为根的子树中距离xix_ixi不超过kik_iki的点,并且可以用cic_ici的代价使该摄像机无效。问未被覆盖点权和-总花费的最大值。n,m≤300000n,m\le300000n,m≤300000分析首先可以最小割建图:sss往摄像头连流量为费用的边,摄像头往能覆盖的点连流量为i...原创 2019-11-16 11:26:28 · 384 阅读 · 0 评论 -
51nod 1618 树或非树 树链剖分+线段树
题意G是一张由n个点和n条边组成的无向图。G中没有自环和重边。每条边有两种状态“开”和“关”。一开始,所有的边都是“关”着的。 现在有m个操作(v,u),表示将从v到u的最短路上的边改变状态(如果状态为“开”则变成“关”,反之,变成“开”)。如果v到u存在多条最短路,则我们选取点序列字典序最小的那一条。 比如,将所有从v到u的路径上的点表示成序列为 v,v1,v2,…,u 。那么我们从中取字典序原创 2017-10-24 20:15:58 · 590 阅读 · 0 评论 -
bzoj 1969: [Ahoi2005]LANE 航线规划 离线+树链剖分+线段树
题意给你一个无向图,要求资瓷两个操作:删除一条边,或(x,y)表示询问有多少条边满足删掉后x和y不连通。 保证任意时刻该图连通。 n<=30000,m<=100000,q<=40000分析看到该图始终连通后,很容易想到先离线搞一棵生成树出来,那么答案的割边一定在这棵生成树上。 我们把询问离线,把删边变为加边,每加一条边就相当于把这条边两个端点路径上的边染成黑色,询问就相当于问两点路径上白色边的原创 2017-11-02 19:24:55 · 324 阅读 · 0 评论 -
bzoj 4381: [POI2015]Odwiedziny 分块+树链剖分
题意给定一棵n个点的树,树上每条边的长度都为1,第i个点的权值为a[i]。 Byteasar想要走遍这整棵树,他会按照某个1到n的全排列b走n-1次,第i次他会从b[i]点走到b[i+1]点,并且这一次的步伐大小为c[i]。 对于一次行走,假设起点为x,终点为y,步伐为k,那么Byteasar会从x开始,每步往前走k步,如果最后不足k步就能到达y,那么他会一步走到y。 请帮助Byteasar统原创 2017-12-10 00:10:58 · 392 阅读 · 0 评论 -
51nod 1819 黑白树 V2 树链剖分维护轻儿子信息+线段树
题意给定一棵以1为根的有根树,点可能是黑色或白色,操作如下。 1. 选定一个点x,将x的子树中所有到x的距离为奇数的点的颜色反转。 2. 选定一个点x,将点x的颜色反转。 3. 选定一个点x,询问所有黑点y(包括点x)与点x的lca(最近公共祖先)的和。 n,m分析这可能是我写过的最长的一道树链剖分。。。先附上官方的题解: 考虑用树链剖分维护答案。 线段树上要维护一原创 2018-01-05 08:01:44 · 376 阅读 · 0 评论 -
bzoj 4712: 洪水 树链剖分+线段树优化dp
题意小A走到一个山脚下,准备给自己造一个小屋。这时候,小A的朋友(op,又叫管理员)打开了创造模式,然后飞到山顶放了格水。于是小A面前出现了一个瀑布。作为平民的小A只好老实巴交地爬山堵水。那么问题来了:我们把这个瀑布看成是一个n个节点的树,每个节点有权值(爬上去的代价)。小A要选择一些节点,以其权值和作为代价将这些点删除(堵上),使得根节点与所有叶子结点不连通。问最小代价。不过到这还没结束。小原创 2018-01-09 17:04:31 · 458 阅读 · 0 评论 -
Codeforces 600E Lomsat gelral [dsu on tree(树上启发式合并)]
题意给出一棵树,1为根节点,每个点都有一个颜色。求每个点所在子树内所有出现次数最多的颜色的和。 n分析新学习了一种姿势叫dsu on tree,大概意思就是树上启发式合并吧。 dsu on tree大概是用来解决这样一类问题:需要多次查询某棵子树内的某个值(必须要离线)。像这题就是需要查询每棵子树出现颜色次数最多的颜色的和。 怎么做呢? 首先我们把这棵树的dfs序求出来,顺原创 2017-06-19 19:22:10 · 1101 阅读 · 0 评论 -
Codeforces 487E Tourists 圆方树+树链剖分+线段树
题意给出一个无向图,点有点权。要求资辞以下操作: C x y表示把x的点权改为y A x y表示询问x到y所有简单路的并中点权的最小值 n,m,q分析在今天immortalCO大爷讲的圆方树课件里面有这题,于是就跑过来刷一波。 题解的方法实际上就是把圆方树建了出来。 圆方树的构建就是把原图中的所有边去掉,设原图中每个点为圆点,对于每个点双建立一个方点,对在该点双里面的每个原创 2018-02-06 22:32:06 · 621 阅读 · 0 评论 -
Codeforces 504E Misha and LCP on Tree 树链剖分+后缀数组
题意给一棵树,每个节点上有一个字符。每次询问a到b的路径组成的字符串和c到d的路径组成的字符串的lcp。 n<=300000,q<=1000000分析我们可以先重链剖分一下,然后把每条重链正着放一遍反着放一遍,这样就形成了一个字符串,建出这个字符串的后缀数组。 询问的时候,把路径上的O(log)个区间拿出来,然后扔到后缀数组里面求lcp就好了。 时间复杂度O(nl...原创 2018-03-08 16:39:08 · 428 阅读 · 0 评论 -
bzoj 4012: [HNOI2015]开店 树链剖分+可持久化线段树
题意给出一棵数,点有点权。每次询问所有点权在[L,R]之间的点到点u的距离和。强制在线。 n<=150000,Q<=200000分析如果没有点权限制的话,我们可以通过树剖线段树,来维护每个点轻儿子子树的节点数量,节点深度和以及节点数量*该点深度的和。 现在有了权值的限制,那么只要把线段树可持久化一下,每次在对应的线段树里面查询即可。代码#includ...原创 2018-03-20 18:37:59 · 290 阅读 · 0 评论 -
bzoj 4811: [Ynoi2017]由乃的OJ 树链剖分+线段树+贪心
题意给你一个有n个点的树,每个点的包括一个位运算opt和一个权值x,位运算有&,l,^三种,分别用1,2,3表示。每次询问包含三个数x,y,z,初始选定一个数v。然后v依次经过从x到y的所有节点,每经过一个点i,v就变成v opti xi,所以他想问你,最后到y时,希望得到的值尽可能大,求最大值?给定的初始值v必须是在[0,z]之间。每次修改包含三个数x,y,z,意思是把x点的操作修改...原创 2018-04-23 08:46:55 · 284 阅读 · 0 评论 -
NOIP2018 保卫王国 动态dp
题意有一棵n个点的树,在每个点上放士兵都有一个花费a[i],要求每相邻的两个点之间至少有一个点要放士兵。有m个询问,每个询问会固定两个点的选择,然后问最小花费。n,m≤105n,m\le10^5n,m≤105分析设fi,0/1f_{i,0/1}fi,0/1表示以iii为根的子树,iii放或不放士兵的最小花费。考虑一条链要怎么做。显然有fi,0=fi−1,1fi,1=ai+min(f...原创 2019-02-07 12:19:00 · 496 阅读 · 0 评论 -
UOJ #139.【UER #4】被删除的黑白树 长链剖分
题意给出一棵有根树,要求对尽量多的节点染色,使得每个叶节点到根的路径上的染色节点数都相等。n≤105n\le10^5n≤105分析开始刷水题了。。。设dp[i,j]表示以i为根的子树中每个叶节点到i路径上的染色点数恰好为j时的答案,用长链剖分优化转移就是O(n)O(n)O(n)的了。代码#include<iostream>#include<cstdio>#...原创 2019-02-07 17:36:04 · 310 阅读 · 1 评论 -
LibreOJ #3052. 「十二省联考 2019」春节十二响 长链剖分
题意给一棵树,点有点权,要求把所有节点分成若干个集合,使得同一集合中任意两点不存在祖先关系,且每一集合的最大点权的和最小。n≤2∗105n\le2*10^5n≤2∗105分析考虑递归处理,假设当前节点的两棵子树都已处理好,那么合并两棵子树的方式为最大值和最大值合并,次大值和次大值合并,如此类推。可以用长链剖分+优先队列来优化到O(nlogn)O(nlogn)O(nlogn)。代码#i...原创 2019-06-22 12:06:38 · 229 阅读 · 0 评论 -
Comet OJ - Contest #5 迫真树 长链剖分
题意给一棵n个节点的树,点有点权,要求选出若干个点,使得这些点的权值和不超过m且删掉这些点后森林的直径最小。n≤105n\le10^5n≤105分析很容易想到二分答案后dp,设fx,if_{x,i}fx,i表示节点x为根的子树,满足子树内的直径不超过二分的答案mid,且从x开始的最长链长度为i的方案。合并子树的时候,讨论加入新子树后是否更新从x出发的最长链来转移即可。发现i的数量级为...原创 2019-06-27 08:59:35 · 283 阅读 · 0 评论 -
【LibreOJ #3014. 「JOI 2019 Final」独特的城市】【长链剖分】
题意有一棵nnn个点的数,每个点有一种颜色。定义yyy被xxx支配当且仅当不存在zzz满足dis(x,z)=dis(x,y)dis(x,z)=dis(x,y)dis(x,z)=dis(x,y)。对于每个点,求出所有被他支配的点中有多少种不同的颜色。n≤300000n\le300000n≤300000分析先把直径求出来,对于一个点,被他支配的点一定在他到直径两端点中离他较远的那个点的路径上。...原创 2019-08-07 08:48:13 · 569 阅读 · 2 评论 -
51nod 1600 Simple KMP 后缀自动机+树链剖分+线段树
题意对于一个字符串|S|,我们定义fail[i],表示最大的x使得S[1..x]=S[i-x+1..i],满足(x分析首先我们来分析一下这道题的各种性质。 f(S)就相当于每个前缀在原串中出现的次数(不包括前缀本身)。 不难发现key(S)就相当于每个非空子串S的f(S)*(n-pos[S]+1)的和,pos[S]表示S结尾字符的位置。 假设我们维护出了当前S每个子串S的f(S)的和,设为to原创 2017-11-01 17:20:38 · 859 阅读 · 0 评论 -
bzoj 4999: This Problem Is Too Simple! 树链剖分+线段树
题意给您一颗树,每个节点有个初始值。 现在支持以下两种操作: 1. C i x(0<=x<2^31) 表示将i节点的值改为x。 2. Q i j x(0<=x<2^31) 表示询问i节点到j节点的路径上有多少个值为x的节点。n<=100000,q<=200000分析像这种题,一般的套路就是对每种权值开一棵线段树然后直接树链剖分即可。代码#include<iostream>#include<c原创 2017-09-04 19:56:56 · 473 阅读 · 0 评论 -
bzoj 1984: 月下“毛景树” 线段树+树链剖分
题意给出一棵n个节点的树,每条边都有权值,要求资瓷以下操作: Max x y表示查询x到y之间的最大权值 Cover x y z表示把x到y的权值赋为z Change x y表示把第x条边的权值变成y Add x y z表示把x到y的权值加上z n+m<=100000分析一眼树剖+线段树。 把边权下放到两端深度较大的那个点即可。 线段树维护两个标记和最大值。 注意两个点的lca不用处原创 2016-11-15 08:13:42 · 556 阅读 · 0 评论 -
bzoj 3626: [LNOI2014]LCA 树链剖分
题意给出一个n个节点的有根树(编号为0到n-1,根节点为0)。一个点的深度定义为这个节点到根的距离+1。 设dep[i]表示点i的深度,LCA(i,j)表示i与j的最近公共祖先。 有q次询问,每次询问给出l r z,求∑l<=i<=rdep[LCA(i,z)]。\sum_{l<=i<=r}dep[LCA(i,z)]。 (即,求在[l,r]区间内的每个节点i与z的最近公共祖先的深度之和) n,原创 2016-12-16 21:57:42 · 364 阅读 · 0 评论 -
bzoj 3683: Falsita 树链剖分+线段树
题意给出一棵有根树,一开始每个节点都有一个权值。要求资瓷三个操作: S x delta节点x的权值增加delta M x delta以x为根的子树的所有节点的权值增加delta Q x询问(∑lca(p,q)==xv[p]+v[q])/(∑lca(p,q)==x)(\sum_{lca(p,q)==x}v[p]+v[q])/(\sum lca(p,q)==x) n,m<=300000分析一开始原创 2017-02-15 20:41:52 · 1401 阅读 · 0 评论 -
bzoj 4538: [Hnoi2016]网络 树链剖分+线段树
题意给出一棵树,要求资瓷m个操作: 0 x y v表示点x和点y有一个交互请求,权值为v 1 t表示第t个操作的请求被取消 2 x表示询问没有覆盖x的交互请求的最大权值 n<=100000,m<=200000分析一开始没有看到删除操作,以为是一道傻逼题。。。首先树剖,然后对于一个请求,显然其能影响到的点为不在该链上的点,那么就把区间取反,然后插入即可。但由于有删除操作,于是我们在线段树的每个原创 2017-03-13 21:10:45 · 330 阅读 · 0 评论 -
bzoj 4515: [Sdoi2016]游戏 树链剖分+线段树
题意给出一棵树,边有边权,一开始每个节点上都有一个权值123456789123456789,要求资瓷两个操作 1 s t a b对s到t路径上的每个节点x加入一个a*w+b的权值,w为x到s的距离 2 s t求s到t路径上的最小值 n,m<=100000分析据说这道题的序列形式叫做李超树,就是每次在区间加入一条线段,然后查询区间的最小值。 但是这是一棵树,那很明显就要上个树剖然后用线段树维护原创 2017-03-26 21:50:03 · 616 阅读 · 0 评论 -
bzoj 4817: [Sdoi2017]树点涂色 link cut tree+线段树+树链剖分
题意Bob有一棵n个点的有根树,其中1号点是根节点。Bob在每个点上涂了颜色,并且每个点上的颜色不同。定义一条路 径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色。Bob可能会进行这几种操作: 1 x: 把点x到根节点的路径上所有的点染上一种没有用过的新颜色。 2 x y: 求x到y的路径的权值。 3 x y: 在以x为根的子树中选择一个点,使得这个点到根节点的路径权值原创 2017-04-13 21:50:40 · 1098 阅读 · 0 评论 -
bzoj 3999: [TJOI2015]旅游 树链剖分+线段树
题意给一棵树,有点权。每次一个操作x y z表示询问从x出发走到y的路径上最大的a[i]-a[j](必须满足先到i再到j)。然后把路径上的点权加上z。 n,q<=50000分析一开始看的时候没啥思路,想了想发现如果用线段树维护的话是可以合并区间的。 那么我们只要用线段树维护两个值,一个是正着走的答案,一个是反着走的答案。查询的时候把路径拆成两条分别查询即可。代码#include<iostream原创 2017-04-21 16:33:34 · 444 阅读 · 0 评论 -
bzoj 3531: [Sdoi2014]旅行 线段树+树链剖分
题意S国有N个城市,编号从1到N。城市间用N-1条双向道路连接,满足 从一个城市出发可以到达其它所有城市。每个城市信仰不同的宗教,如飞天面条神教、隐形独角兽教、绝地教都是常见的信仰。为了方便,我们用不同的正整数代表各种宗教, S国的居民常常旅行。旅行时他们总会走最短路,并且为了避免麻烦,只在信仰和他们相同的城市留宿。当然旅程的终点也是信仰与他相同的城市。S国政府为每个城市标定了不同的旅行评级,旅原创 2017-04-27 20:09:15 · 324 阅读 · 0 评论 -
bzoj 3589: 动态树 树链剖分+线段树
题意给出一棵树,要求资瓷两个操作: 操作0: 这棵树长出了一些果子, 即某个子树中的每个节点都会长出K个果子. 操作1: 小明希望你求出几条树枝上的果子数. 一条树枝其实就是一个从某个节点到根的路径的一段. 每次小明会选定一些树枝, 让你求出在这些树枝上的节点的果子数的和. 注意, 树枝之间可能会重合, 这时重合的部分的节点的果子只要算一次. n,m<=200000,答案模2^31-1输出原创 2017-06-17 14:09:24 · 494 阅读 · 0 评论 -
bzoj 1758: [Wc2010]重建计划 长链剖分+线段树
题意有一棵树,每条边有边权。请找一条长度为[L,R]之间的简单路径,使得这段路径的平均长度最大。 n<=100000,vi<=1000000分析很显然是先二分答案然后找树上长度在[L,R]之间的最长链。正解是点分治+单调队列,由于我刚学习了一波长链剖分,便拿这题来练练手。 关于长链剖分 长链剖分有两个作用:一是O(nlogn)预处理后O(1)查询一个点的第k级祖先。二是O(n)维护每个子树以深原创 2017-07-11 08:30:29 · 523 阅读 · 0 评论