树链剖分
hhhcbw
Hello World!!!
展开
-
树链剖分(四)——旅行
题目链接:https://loj.ac/problem/2195解题思路树链剖分+动态开点线段树。可以通过树链剖分将问题转化成询问序列上与起点相同宗教的权值总和及最大值,并且支持单点更新。这个问题可以用线段树解决,但一般线段树要开四倍空间,而且要维护不同宗教,所以空间肯定不够。但是我们可以动态开点,树上每个点最多对应logn个点,所以动态开点最多也就nlogn个点,空间就够了,就是牺牲了常数的时间去开点,在这是可以接受的。AC代码#include <iostream>#include原创 2020-09-05 19:16:38 · 247 阅读 · 0 评论 -
树链剖分(三)——染色
很好的树链剖分题,因为线段树有个地方写错了,wa了好久QAQ题目链接:https://loj.ac/problem/10141解题思路我们利用树链剖分,就可以将问题转化成序列上的染色问题,即问一段连续区间有多少段颜色,并且支持更新,这就可以用线段树来实现。还需要注意一点的是,因为树链剖分,是将路径分成好几段连续序列,即重路径,所以向上找LCA的时候,还需要考虑这一段的下边界(即右边界)和之前那一段序列的上边界(即左边界)颜色是否相同,如果相同,自然要把他们算到同一段里,Ssum–。到最后,x和y在.原创 2020-09-05 15:58:00 · 261 阅读 · 0 评论 -
树链剖分(二)——软件包管理
题目链接:https://loj.ac/problem/2130解题思路树链剖分简单题,两个操作,安装是该点到根的简单路径的查询和更新,卸载是以该点为根的子树的查询和更新。利用树链剖分,可以转化成序列的查询和更新,然后线段树维护即可。AC代码#include <iostream>#include <stdio.h>#include <cstring>#include <algorithm>using namespace std;const i原创 2020-09-04 17:06:37 · 130 阅读 · 0 评论 -
树链剖分(一)——树上操作
题目链接:https://loj.ac/problem/2125解题思路树链剖分基础题,单点更新,更新以x为根的子树,因为以x为根的子树就是连续的序列,所以直接记录该根的最右区间,直接区间更新即可。查询x到1的权值和,就是直接树链剖分的查询即可。//单点修改,区间查询和与最大值#include <iostream>#include <stdio.h>#include <cstring>#include <algorithm>using name原创 2020-09-03 16:02:34 · 260 阅读 · 1 评论