![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
树链剖分
cy41
celery cabbage
展开
-
2019西安邀请赛 E.Tree(树链剖分)
题目链接:Tree 题意:一棵树,有点权,支持链上所有点与一个数字,或一个数字,询问链上所有点异或和异或题目给定的数字是否为正数。 树链剖分将链转换为区间。 先考虑线段树的操作,将点权拆解成二进制,那么区间与,或就相当于区间覆盖0,1,线段树维护区间内每一位的1的个数。 对于操作1,2直接做。 对于查询3,可以做30次查询,每次查询链上所有数字这一位上1的个数是否为奇数,若为奇数说明最终的异或答案...原创 2019-09-03 10:48:07 · 231 阅读 · 2 评论 -
树链剖分(模板)
一个个人认为讲的比较好的B站up主:【AgOHの算法胡扯】树链剖分 前置知识:图的存储及遍历,dfs序(只存第一次被访问),线段树区间操作。 树链剖分支持的操作:(点权以及边权是可以互相转化的,这里只说点权。) upd:2020/1/15最下方新增边剖示例。 修改及查询以x为根的子树权值 修改及查询一条链上的权值(链的定义为:树上两点的最短路径) int index1;//时间戳; ...原创 2019-08-07 09:13:22 · 274 阅读 · 0 评论 -
P1505 [国家集训队]旅游(树链剖分)
题目链接:P1505 [国家集训队]旅游 对于边的剖分,将每条边的编号赋值为其后向点的dfs序编号,因为在dfs过程中,儿子节点有且只有一个直接父亲,那么可以将这条边的编号写作这个儿子的编号。 修改一条链上的边权,与点权不同的是,当两个点处于同一条重链的时候,深度较浅的那个点对应的边不属于我们修改的范围: void updatachain(int x,int y){ while(topp[...原创 2019-09-02 21:33:19 · 143 阅读 · 0 评论 -
P3313 [SDOI2014]旅行(树链剖分+线段树动态开点)
题意:一棵树,树上的点有不同的权值以及属性,支持四种操作: 修改某个点的属性 修改某个点的点权 询问从x到y的链上,与x相同的属性的点的权值和。 询问从x到y的链上,与x相同属性的点权最大值。 数据范围:树的点数,属性值,询问次数<=105<=10^5<=105,一个点的点权在所有时刻都是<=104<=10^4<=104的正整...原创 2019-09-03 15:56:02 · 164 阅读 · 0 评论 -
牛客练习赛51 F-ABCBA(树链剖分,线段树,状态转移)
题目链接:F-ABCBA 题意:给出一颗树,树上节点为一个字母,q次询问,每次询问u,v,从v到u的链上组成的字符串,包含序列"ABCBA"的个数(不是子串,可以不连续)。 给要求的这个序列编号:1,2,3,4,5; 首先树剖两次dfs预处理。 定义a[i][j]a[i][j]a[i][j]表示当前串包含序列[i,j][i,j][i,j]的数量。 用线段树来维护,正着合并以及反着合并,因为树剖查询...原创 2019-09-07 10:36:37 · 168 阅读 · 0 评论 -
bzoj2243 染色(树链剖分+线段树)
题目链接:bzoj2243 染色 题意:一棵树,有点权,覆盖链上的颜色,询问链上颜色的段数。 序列的颜色段数很好求,只要维护区间颜色段数,以及最左端与最右端的颜色种类即可。 考虑树上操作,可以树链剖分将树上操作转化为链上操作。 修改很好做查询需注意。 链上版本可以拆为两个:x往上跳,y往上跳,可以自己定义序列方向为x->y,那么只需要合并时候注意一下就好。 #include<bits/...原创 2019-09-12 14:56:52 · 167 阅读 · 0 评论