随笔分类 -  树链剖分

摘要:区间更新加法与乘法,x取反是2^64-x-1,由于取模所以取反变成-x-1,就区间*-1再-1就可以了,最后区间询问求和。 #include <bits/stdc++.h> #define pb push_back #define mp make_pair #define fi first #def 阅读全文
posted @ 2018-09-16 09:29 LMissher 阅读(224) 评论(0) 推荐(0)
摘要:给一幅无权无向无环图并给出它的一颗生成树,要求出一个最小割,并且最小割中有且仅有一条树边。 一条从u到v的非树边会让它从树上u到v路径上的边成为最小割的代价+1,所以考虑树链剖分把所有非树边作为更新来更新路径上边的代价。 因为只需要在最后找出最小的那条边,所以直接差分即可。 #include <bi 阅读全文
posted @ 2018-09-14 15:01 LMissher 阅读(166) 评论(0) 推荐(0)
摘要:所谓树链剖分就是把树上的路径转化为连续的区间从而用各种数据结构解决树上的问题。 而转化为区间则是利用其重链的性质把一条树上的路径变成很多连续的重链从而加速找两点的lca。 并在节点向上跳的过程中对区间用数据结构做更新操作,或是将连续的重链保存做离线操作。 常见的树链剖分有更新链或子树的权值并求其权值 阅读全文
posted @ 2018-08-31 22:03 LMissher 阅读(304) 评论(0) 推荐(0)
摘要:给一颗树,给q次询问,每次询问给一条路径x到y并且给这条路染色v。 问最后每个点分别被哪种颜色染色的最多。 首先考虑在直线上的这种问题,我们可以把每次染色的区间左端点和右端点记录下来。然后建一颗颜色的权值线段树。 每次到左端点的时候把权值线段树的颜色++,到右端点+1的时候把颜色--。类似差分。然后 阅读全文
posted @ 2018-08-29 14:34 LMissher 阅读(125) 评论(0) 推荐(0)
摘要:有n个节点的树,有q次操作,每次操作选择一条路径问从起点出发到终点可以在任意点花vi买入一个商品并在之后任意一点以vj卖掉。 问最大收益是多少,并在每次操作后将那条路径所有点权加上v。 树链剖分将问题变为直线上的问题后,考虑用线段树维护一个最大值与最小值,以及从直线左到右的最大收益以及直线右到左的最 阅读全文
posted @ 2018-08-29 14:33 LMissher 阅读(161) 评论(0) 推荐(0)
摘要:题意是有n个没有安装的软件包形成一个树形结构,安装一个软件包必须把它的所有祖先一起安装,卸载一个软件包必须把它的所有子孙一起卸载。 q次操作,每次可能安装一个节点也可能卸载一个节点,问每次操作会改变多少个节点的状态。 安装是对链操作,卸载是对子树操作。线段树维护区间内的安装数量与未安装数量,更新的时 阅读全文
posted @ 2018-08-29 14:32 LMissher 阅读(285) 评论(0) 推荐(0)
摘要:题意给你q次询问,给一条链问从给定起点到给定终点的最长连续严格递增子序列。 因为给定起点与终点所以路径可能与dfs序的树节点展开顺序相反。所以问题变成了给n个数询问一个区间的最长LCIS。 但因为方向可正可负,所以我们除了维护区间的最长递增以外还要维护最长递减。线段树的部分就做完了。 树链剖分的时候 阅读全文
posted @ 2018-08-28 23:21 LMissher 阅读(210) 评论(0) 推荐(0)
摘要:给一棵边权树,再给三个操作。第一个把一条边权改为v,第二个将一条链的值取反,第三个求一条链的最大值。 考虑用线段树维护连续区间的最大最小值。区间取反打lazy标记,如果lazy是奇数就取反再把最大最小值交换下放,否则不管,单点更新和区间查询很简单。 最后用树剖更新区间。把边权映射到点权即可。 #in 阅读全文
posted @ 2018-08-27 21:58 LMissher 阅读(148) 评论(0) 推荐(0)
摘要:和poj2763一样 #include <cstdio> #include <cstring> #define Lson l,mid,rt<<1 #define Rson mid+1,r,rt<<1|1 using namespace std; const int M = 5e4+7; typede 阅读全文
posted @ 2018-08-27 17:01 LMissher 阅读(130) 评论(0) 推荐(0)
摘要:树链剖分模板题(处理边权) 注意把边权归到点上,在查询的时候注意不要lca点的权值,另外线段树注意如果当两个点在同一条重链且都在lca点时,直接返回。 树状数组最后计算链时不用归到重儿子上,直接减就好。 segment_tree: #include <cstdio> #include <cstrin 阅读全文
posted @ 2018-08-27 16:33 LMissher 阅读(152) 评论(0) 推荐(0)
摘要:树链剖分模板题。更新一条链的值以及求一个点的值。 可以用线段树或树状数组来区间更新加单点查询。 #include <bits/stdc++.h> #define Lson l,mid,rt<<1 #define Rson mid+1,r,rt<<1|1 using namespace std; co 阅读全文
posted @ 2018-08-27 13:04 LMissher 阅读(163) 评论(0) 推荐(0)
摘要:树链剖分模板题。更新一条链的值以及求一条链的值。 熟练剖分就是把树剖成重链与轻链,然后利用重链的性质快速的把要更新的两个节点间的路径快速进行更新,也就是快速找到lca。进行更新或查询。 #include <bits/stdc++.h> #define Lson l,mid,rt<<1 #define 阅读全文
posted @ 2018-08-27 10:57 LMissher 阅读(163) 评论(0) 推荐(0)