
线段树
sophilex
Every day,Every moment
展开
-
树链剖分入门指南
很多情况下我们需要在树上处理一些路径问题,比如叶子到根节点的路径最大子段和之类的,有时候还要加入修改操作,这时候树剖就是一个非常强有力的武器。对于每一个节点a,定义重儿子为其儿子节点中对应子树最大的儿子,重链为以a为起点的一条链,链中的每一个节点都是一个相应节点的重儿子。如图,红色为重儿子,蓝色路径为重链(还是很好理解的)当然,对于叶子节点来说,它自己本身就是一条重链。原创 2022-09-07 16:48:36 · 248 阅读 · 0 评论 -
树链剖分 边权下放点权
首先,对于一条边,它有两个顶点,那么肯定是让深度较浅的点,也就是父节点的点权来作为这条边的边权。然后最后我们要查边权的时候,只要查它对应的子节点就可以了。2.树上路径更新的时候,你稍微手玩一下就会发现两个节点的lca是不应该被更新的,所以在最后一步更新的时候,我们的代码要有所改变。3.查询树上路径权值和时(如果有这个操作),同理两点的lca的点权不应该被算进去,因为它对应的边不属于这两点的路径上。同理,你也可以这么写,意思我就不解释了。其实就是把lca的更新的结果给改回去。就那么些操作,没有大意。原创 2022-08-19 22:02:46 · 263 阅读 · 0 评论 -
dfs序板子+树状数组板子题 求和
求和大意:单点修改,子树查询;思路:dfs,将树掰成线性的;然后无脑树状数组即可水水更健康~#include<bits/stdc++.h>using namespace std;#define ll long long#define lowbit(x) x&(-x)const ll N=1e6+10;ll n,m,k;ll a,b,c;ll tr[N];ll mas[N];//初始权值 struct ty{ ll t,next;}e...原创 2022-03-31 21:46:06 · 382 阅读 · 0 评论 -
莫队/树状数组+离线 :HH的项链 及莫队例题
项链大意:一段数组,每次查询一个区间,询问区间内的数字种类数。思路:这道题其实做法比较多莫队/主席树(当然我还不会。。。)/树状数组都可以。先讲一下树状数组的做法:采用离线+树状数组求前缀和因为询问比较多,在线做的话用树状数组属实是扛不住,所以离线,然后按r从小到大排序。那么对于每一次从查询【l,r】,以及我们当前查到的w:如果w对应的数k之前是没有出现过的,那么直接将这一点w的权值记为1即可,后面树状数组维护前缀和即可。但k如果之前在w'位置出现过,..原创 2022-03-26 12:24:59 · 441 阅读 · 2 评论 -
求N元上升子序列(挖坑)
三元上升子序列还没搞懂,先贴着,以后填。。。大意:给定一个数组,求N元上升子序列的数量思路:(来自洛谷大佬)DP + 树状数组优化设f[i][j]f[i][j]为以a[j]a[j]为结尾的长度为ii的上升子序列的个数得到转移方程:然后用树状数组维护。。。维护啥呢,下次再说 :)...原创 2022-03-15 19:25:38 · 342 阅读 · 0 评论 -
换个角度思考(离线查询+树状数组)
题目链接大意:思路:数组大小范围为1e5,查询次数范围1e5,每次在线枚举查找是扛不住的。所以我们可以选择离线。因为这里不会有修改操作,所以我们可以将离线下来的询问按询问值来排序。同时将原数组按照大小排序。那么遍历询问数组时,因为查询键值是从小到大的,我们当前找到的满足条件的数字,也就是小于当前查询值的数字,之后也是有可能满足条件的(事实上只要它在对应的要求区间里,它就会一直满足条件)。那么就可以用一个树状数组来统计前缀和,也就是在某一区间内满足条件的数字的总数。因为这个原创 2022-03-15 18:35:36 · 302 阅读 · 0 评论 -
线段树+位运算 红球进黑洞
红球进黑洞大意:与线段树模板题唯一的区别就是这里的修改操作变成了对区间每一个元素与给定值进行异或操作。思路:对于异或操作,我们一般都会考虑按位进行运算。所以这里可以考虑建一个二维数组来维护线段树,一维是每一个二进制位,另一维就是区间长度。那么每次求区间和时,只要把每一个二进制位对应的区间和求出来并乘上对应的二的幂次,最后累加即可。并且因为这里是异或操作,对于每一个二进制位我们只用考虑0/1,所以change操作也会更加好写一点(其实只是省了每次的常数而已,但也是方便 :=)另外原创 2022-03-15 11:45:08 · 434 阅读 · 0 评论