
树链剖分
Icefox_zhx
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
bzoj4034 [HAOI2015]树上操作(树链剖分)
子树修改,通过dfn序可以变成区间修改。然后就是裸题了。原创 2017-09-08 09:55:28 · 384 阅读 · 0 评论 -
bzoj1036 [ZJOI2008]树的统计(树链剖分/lct)
树链剖分就是划分轻重链,把每个点映射到线段树上,保证一条重链上的点在线段树中是一段完整的区间。可以由2遍dfs完成。主要还是个线段树。复杂度O(nlogn+mlog2n)" role="presentation" style="position: relative;">O(nlogn+mlog2n)O(nlogn+mlog2n)O(nlogn+mlog^2n) 树链剖分 #include原创 2017-09-08 09:20:40 · 304 阅读 · 0 评论 -
bzoj2157 旅游(树链剖分)
树链剖分裸题。原创 2018-03-08 14:22:56 · 248 阅读 · 0 评论 -
bzoj4538 [Hnoi2016]网络(树链剖分,线段树套堆)
给定一棵树,三种操作: 1、加入一条路径 2、删除一条已加入的路径 3、询问不过一个点x的路径的最大值。我们用树链剖分,把路径分成logn个连续的区间,然后对这些区间的补集(即不在路径上的所有点)扔进此条路径的值。线段树的每个节点维护一个可以删除的大根堆。询问时对线段树上所有包含点x的节点的堆顶取个max即可。时间复杂度O(nlog3n)O(nlog^3n),空间复杂度O(nlog2n)O(n原创 2018-03-08 16:03:10 · 324 阅读 · 0 评论 -
bzoj4012 [HNOI2015]开店(动态点分治+二分+STL/树链剖分+主席树)
如何求所有点到一个点的距离和呢?类似bzoj3924我们的处理方法。 对于每个节点x维护 s1[x]–x的子树中的点到x的距离 s2[x]–x的子树中的点到fa[x]的距离 然后logn的在重心树上跳一跳,减去重复的,补上少的即可。 这题还有一个年龄的限制,怎么办呢?很容易想到线段树,但是我不会写gg 我们还可以利用vector+二分来做。 把所有点按年龄从小到大排序,做前缀和。每次...原创 2018-02-23 23:42:18 · 402 阅读 · 0 评论 -
bzoj5279 [Usaco2018 Open]Disruption(树链剖分)
对于每条额外边x-y,可以作为原树上x-y的路径上的任意一条边删去时的答案,所以路径更新最小值即可。原创 2018-04-20 22:38:01 · 424 阅读 · 0 评论 -
bzoj3681 Arietta(dsu on tree+主席树优化建图+网络流)
显然就是个建图最大流。然而边数爆炸。 我们考虑每个节点维护一棵线段树表示子树信息来优化建图,然后边数还是爆炸。 我们再考虑树上建主席树来优化建图,不错,好像可以了,然而子树信息不可减(维护的是权值为x的点的标号)gg这时候我们要用到一种黑科技:dsu on tree! 也就是树上启发式合并。更多参考资料:portal大概就是划分轻重链,然后轻边暴力,这样复杂度就科学了! 具体说下:每个点的线原创 2018-04-26 21:50:17 · 407 阅读 · 0 评论 -
bzoj4515 [Sdoi2016]游戏(树链剖分+李超线段树)
我们把x->y的路径分为x->t,t->y两部分来考虑(t为x,y的lca) 分别化出只跟dis[v]有关的函数。然后就可以树链剖分+李超线段树来维护最小值了。因为要求区间最小值,所以还要维护区间最小值。 复杂度O(nlog3n)O(nlog^3n)原创 2018-05-06 00:06:52 · 279 阅读 · 0 评论 -
uoj30【CF Round #278】Tourists(圆方树+树链剖分+可删除堆)
求一般图两点之间所有简单路径上的点权的最小值。 我们搞出圆方树,原图两点间的所有简单路径的并就对应了圆方树上两点间路径。圆点权值为原点点权,方点权值为这个点双的权值最小值。 树链剖分维护路径最小值即可。 但是这样修改一个点的点权时可能需要修改一堆方点,复杂度会爆炸。 于是一个小trick,我们每个方点只维护儿子圆点的权值最小值。这样更改一 个点的权值时,只需要更改它的父亲方点一个即可。查...原创 2018-05-31 20:33:21 · 491 阅读 · 0 评论 -
bzoj2164 采矿(树形背包dp+线段树优化+链剖)
首先我们如果能预处理出dp[x][j]表示x子树内分配j个人最大获益,然后每次询问O(m)的循环一下,还需要知道在链上某一个点分配m-j个人的最大获益,我们发现这个东西可以放在线段树上树剖来维护。但是有修改的话我们预处理的那个dp数组就gg了,怎么办呢qaq 我们发现其实这个dp数组也可以直接在线段树上维护!每次线段树信息合并时背包dp合并一下即可,复杂度O(m2)O(m2)O(m^2) 因此总...原创 2018-06-15 10:45:20 · 522 阅读 · 0 评论 -
bzoj4712 洪水(树形动态dp,树链剖分+线段树二分/链分治)
首先考虑不带修改的话,f[x]表示切断x与子树内的叶子的最小花费,有 f[x]=min(v[x],s[x]),s[x]=∑y∈son[x]f[y]f[x]=min(v[x],s[x]),s[x]=∑y∈son[x]f[y]f[x]=min(v[x],s[x]),s[x]=\sum\limits_{y\in son[x]}f[y] 考虑把点x的权值增加val的影响,首先v[x]+=val,f[x...原创 2018-06-17 22:57:46 · 384 阅读 · 0 评论 -
bzoj4196 [Noi2015]软件包管理器(树链剖分)
树链剖分小水题~维护区间白点个数即可。 复杂度O(nlog2n)O(nlog2n)O(nlog^2n) #include <bits/stdc++.h> using namespace std; #define ll long long #define inf 0x3f3f3f3f #define N 100010 inline char gc(){ static char...原创 2018-06-25 13:15:34 · 234 阅读 · 0 评论 -
bzoj3694 最短路(最短路+树链剖分维护最小值)
对于一条不在最短路径树里的边,设该边的两端点为x,y,长度为len,t为x和y的最近公共祖先,d[i]表示1到i的最短距离。那么对于x和t之间的点u,一定存在1-t-y-x-u的路径。路径长度为d[y]+len+d[x]-d[u]。对于给定的u点,我们需要最小化d[x]+d[y]+len。y和t之间的点同理。 所以我们枚举每一条不在最短路径树里的边.更新x,y路径上的所有点(除了lca)的最小值。原创 2017-09-11 16:37:34 · 545 阅读 · 0 评论 -
hdu5044 Tree(树链剖分+差分)
线段树会T,要用O(n)的区间修改+单点查询,也就是像差值似的,把区间修改变成点修改,最后前缀和就是每个点的值。(可是我这样还是差点T掉了o(╥﹏╥)o)原创 2017-09-11 13:24:46 · 325 阅读 · 0 评论 -
bzoj3999 [TJOI2015]旅游(树链剖分,有向的合并区间)
树链剖分,难点在于怎样维护答案区间。首先,这个题目啊。。。为了强行加上一个修改操作,害得我题都读不明白了。那个涨价就是顺带让你维护一个lazy。 最优解显然就是最大值-最小值啦,但是要有方向的。必须是在前面以最小值买,在后面以最大值卖。也就是一定是x->y的顺序。但是对应到线段树上,也许方向就反了,(毕竟x不一定编号小于y),因此我们在维护答案时,要注意方向。线段树每个区间只好记两个data了,分别原创 2017-09-08 11:28:42 · 685 阅读 · 0 评论 -
bzoj2243 [SDOI2011]染色(树链剖分,线段树求颜色段数)
树链剖分映射到线段树上,点与点的左右关系,大小关系都是不同的。因此维护ls,rs时要小心。合并答案时看的是top[x]和fa[top[x]]的颜色是否相等,看好是ls还是rs原创 2017-09-08 15:05:41 · 433 阅读 · 0 评论 -
bzoj1984 月下“毛景树”(边权的树链剖分)
树链剖分,挺裸的,给的是边权,我们把边权都记在儿子上。用线段树维护单点修改,区间修改,区间加,区间最大值。需要注意的是对路径(x,y)进行操作时,不应算lca(x,y)这一点。因为他所代表的边不在路径上。原创 2017-09-08 17:30:28 · 475 阅读 · 0 评论 -
bzoj3531 [Sdoi2014]旅行(树链剖分+动态开点线段树)
我们给每个宗教都建一棵线段树,维护区间和和区间最大值。但是这样会MLE,因此我们掌握了新技能:动态开点线段树。也就是不预先把所有点都建出来,用到才建。每次最多建logn个点,所以开到mlogn就足够了。这样还要记录每棵树的左右儿子,因为他们已不再是p<<1,p<<1|1,而是任意的点了。原创 2017-09-09 12:31:34 · 422 阅读 · 0 评论 -
bzoj4999 This Problem Is Too Simple!(树链剖分+动态开点线段树)
对每一个权值开一棵线段树,维护区间和。空间不够,要动态开点。原创 2017-09-09 14:36:04 · 511 阅读 · 0 评论 -
fzu2082 过路费(树链剖分)
边权裸题原创 2017-09-09 19:33:29 · 345 阅读 · 0 评论 -
poj3237 Tree(树链剖分)
边权裸题。negate操作就是区间取相反数。因此为了维护最大值,我们还要维护最小值。 tips:多组数据一定要清零啊。。。懒标记要清零啊。血的教训。原创 2017-09-10 19:23:54 · 276 阅读 · 0 评论 -
hdu3966 Aragorn's Story(树链剖分)
点权裸题原创 2017-09-10 20:41:52 · 322 阅读 · 0 评论 -
hdu4718 The LCIS on the Tree(树链剖分)
有向的合并区间。看好了是求最长连续上升子序列,并非最长上升子序列。。。这样就可以拿线段树维护,左端点的值,右端点的值,左端点正着最多几个,右端点正着最多几个,左端点倒着最多几个,右端点倒着最多几个,正着最优几个,倒着最优几个,还要看好方向,真是麻烦呢。原创 2017-09-10 22:33:46 · 495 阅读 · 0 评论 -
bzoj3862/hdu4897 Little Devil I(树链剖分+线段树)
维护边权和,还要维护每个点连接的轻边是否旋转。操作1和操作3是非常裸的边权树链剖分。然而操作2很是神奇???他要更新a到b路径上的邻接边??那不是有很多??复杂度不就废了??WJMZBMR表示哈哈哈。咱们再开一颗线段树,记录每个点连接的轻边的旋转情况。我们考虑一条重链,我们要对这条重莲上的所有点的邻接边(定义为只有一个点在路径上)做旋转。不难发现,最多有两条边是重边(链的两端),其他的都是轻边。所...原创 2017-09-11 10:37:27 · 460 阅读 · 0 评论 -
hdu5052 Yaoge’s maximum profit (树链剖分)
同bzoj3999原创 2017-09-11 13:40:35 · 426 阅读 · 0 评论 -
bzoj3083 遥远的国度(树链剖分+换根)
树链剖分基本操作,换根其实就是把dfs序列分裂,倍增找一下当前rt到询问点x的儿子,把这一段区间去掉即可。 #include <bits/stdc++.h> using namespace std; #define ll long long #define inf 0x7fffffff #define N 100010 inline char gc(){ static cha...原创 2018-07-13 20:09:12 · 450 阅读 · 0 评论