
树链剖分
bestFy
世界上最最最渣的oier.
展开
-
poj3237 Tree
题面在这里题目大意:有一棵树,要求支持树上单点修改,链取反(相反数),询问链上最大边权。做法:额....树剖裸题。维护一个线段树,打tag表示取不取反,然后线段树里要维护最大的和最小的值mx[o]和mi[o],更新的时候就是:swap(mx[o], mi[o]); mx[o] = -mx[o]; mi[o] = -mi[o]。然后先欣赏一下我的艰辛历程emmmm原创 2017-12-04 23:26:15 · 227 阅读 · 0 评论 -
CC FIBTREE Fibonacci Numbers on Tree
题面在这里题意:给一棵树,有4种操作: 1.询问以x为根时y子树内的点权和。 2.询问x~y链上的点权和。 3.将x~y这条链展开,第i个点加上fibifib_i,其中fibifib_i表示斐波那契第i项,fib1=fib2=1fib_1 = fib_2 = 1。 4.恢复到第x个操作时的状态。 本题强制在线。做法:首先fibi=15√×((1+5√2)i−(1−原创 2017-12-28 11:28:34 · 337 阅读 · 0 评论 -
bzoj4012: [HNOI2015]开店
题面在这里题意:给一棵树,每个点上有点权,边上有边权。 每次询问一个u,l,r,输出点权在[l,r]范围内的点到u的距离和。 强制在线。做法:考虑一棵树上所有点到一个点的距离和怎么求。 不难发现应该等于所有点的深度和+点数×u的深度-2×所有点与u的lca的深度和。 于是问题就在于求所有点与u的lca的深度和。 对于这个问题,我们可以先把每个点到根的路径都打标记,原创 2018-01-08 19:23:24 · 320 阅读 · 0 评论 -
loj#6208. 树上询问
题面在这里题意:给一棵树,三种操作: 1.add(x,d),给x到根路径上的点的ki += d 2.mul(x,d),给x到根路径上的点的ti += ki*d 3.询问一个点的ti值做法:树链剖分以后就变成一道线段树好题了qaq 我们考虑在线段树里维护一个tag(a,b,c),ti值即为a*b+c。 这里的a相当于ki。 对于2操作,我们直接b+=d就可以。原创 2018-01-07 22:51:20 · 607 阅读 · 0 评论 -
bzoj4999: 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的节点。做法:树链剖分+动态开点线段树。 每个数值都维护一棵线段树。 不想离散可以用map偷懒。。。代码:/*****************************************原创 2018-01-03 20:58:44 · 280 阅读 · 0 评论 -
bzoj3862: Little Devil I
题面在这里 题目大意: 给一棵树,每条边有黑白两种颜色。有3种操作:一条链上的边的颜色取反(黑->白,白->黑);与一条链相邻的边的颜色取反,相邻就是指只有一个点在链上的边;询问某条链上黑边的数量。开始时边的颜色都是白。做法: 1操作和3操作就是普通的树剖+线段树,很容易维护。 主要是2操作。 我们考虑维护两棵线段树,T[0]T[0]维护正常的边修改,T[1]T[1]是辅助用的,当原创 2017-12-07 11:17:10 · 318 阅读 · 2 评论 -
bzoj2325: [ZJOI2011]道馆之战
题面在这里 题目大意: 这题题目太长了就简单说一下题意。 给一棵树,每个节点分为两个区域A,B,在树上一个节点的某个区域,可以走到相邻节点的同一个区域,或同一个节点的另一个区域。每个区域内有两种状态,’.’表示冰,’#’表示障碍(障碍不能通过),给一些查询u, v,询问从u走到v能经过的最多冰的数量。同时还有一些修改操作,将某一点两个区域修改为s(s是长度为2的字符串)。做法: 这题花了我一原创 2017-12-06 17:57:03 · 332 阅读 · 0 评论 -
bzoj3531: [Sdoi2014]旅行
题面在这里 做法: 树剖+线段树动态开点。 容易想到对每个宗教建一棵线段树,不过空间限制不够,所以需要动态开点。别的都和正常树剖一样。代码如下:/************************************************************* Problem: bzoj 3531 [Sdoi2014]旅行 User: fengyuan Lang原创 2017-12-06 13:01:17 · 251 阅读 · 0 评论 -
bzoj3626: [LNOI2014]LCA
题面在这里做法:首先说明以下都是以1为根的,点的编号是1~n。考虑最暴力的做法:对于一个询问l, r, z,将1~z的点全部打标记,枚举l~r之间的点u,从1~u的路上找到第一个打标记的点,答案就加上这个点的深度。然后稍微转化一下,假如把1~z的点权+1,然后对于l~r之间的点u,询问1~u之间的点权和,答案加上这个和。(正确性显然)再转化,我们把l~r之间的点u,1~u上点权原创 2017-12-05 23:21:56 · 262 阅读 · 0 评论 -
bzoj4034: [HAOI2015]树上操作
题面在这里做法:树剖。线段树维护区间和,打lazy标记。其中子树加就是在dfs序上in[x]到out[x]一段加。/************************************************************* Problem: bzoj 4034 [HAOI2015]树上操作 User: fengyuan Language: C++ R原创 2017-12-05 20:42:54 · 298 阅读 · 0 评论 -
poj2763 Housewife Wind
题面在这里题目大意:有一棵树,每条边有边权,一个人初始在s点。现在有两种操作,一是修改某条边的边权,二是询问这个人走到x点经过的边权总和,并移动到x点。做法:树剖。线段树维护区间和。(第一次树剖一次过qwq太感动了)/************************************************************* Problem: p原创 2017-12-05 18:13:47 · 1195 阅读 · 0 评论 -
bzoj2243: [SDOI2011]染色
题面在这里做法:树剖,就是线段树上要做点文章。要维护区间左端和右端的颜色,要打覆盖标记。合并的时候注意相同颜色答案要减一。/************************************************************* Problem: bzoj2243 [SDOI2011]染色 User: fengyuan Language: C++原创 2017-12-05 01:42:31 · 242 阅读 · 0 评论 -
bzoj1036: [ZJOI2008]树的统计Count
题面在这里树链裸题。。直接上代码qwq/************************************************************* Problem: bzoj 1036 [ZJOI2008]树的统计Count User: fengyuan Language: C++ Result: Accepted Time: 2388 ms Mem原创 2017-11-18 21:31:55 · 290 阅读 · 0 评论 -
bzoj3083: 遥远的国度
题面在这里题意:给一棵树,每个点上有点权。 三种操作: 1.换根 2.链覆盖 3.以当前的根查询某子树内的最小值做法:当然不用真的去换根= = 可以直接令任意一点为根,比如1。 发现一条链是不会发生改变的,于是链覆盖操作可以直接树剖+线段树修改。 对于查询操作,我们分类讨论。 1.假如当前根和x相同,就直接取整棵树的最小值。 2.假如当前根在x的子树(以1原创 2018-01-10 14:58:39 · 351 阅读 · 0 评论