线段树与树状数组
KineXense
DLUT_freshman
展开
-
树状数组
(在图中,其维护的是A1~A8区间线段的一个树状数组)图片转自计蒜客(侵删)先给出他的基本函数:函数1、lowbit(int x)利用相反数相与得到从右往左第一个1对应的数,比如101000(2)取1000。此作用于树状元素C2、getsum(int x) 基本树状数组对应的getsum(n)指的是区间1~n的A元素。用-=lowbit(x)进行循环3、change(int x...原创 2019-03-26 21:10:47 · 142 阅读 · 0 评论 -
离散化以及区间化点——计蒜客课程记录
这是一篇涉及范围比较泛的博客,不是针对某一类题型,大概算作是思想类博客。涉及区间处理的时候,一般不会直接以区间长度做为问题实现的区间范围,而一般(目前以我的水平)有三类的解决方案:1、区间化为点,将不同的区间通过差分的方式化成一个点,维护好不同类型的区间。如果涉及计算,在维护区间的时候可以用前缀和的方式维护(不支持修改,或修改的复杂度为o(n)级)2、查询排序化,见之前的博客3、离散化...原创 2019-04-06 12:07:43 · 465 阅读 · 0 评论 -
树状数组维护区间最值——计蒜客课程记录
树状数组的区间最值不能用前缀和来实现由画图可知所以有修改代码:void change(int r) { c[r] = a[r]; for(int i = 1; i < lowbit(r); i <<= 1) ///修改到lowbit(r)即可 c[r] = max(c[r], c[r-i]);}而这时候支持l~r查询。代码:int ...原创 2019-04-06 11:29:10 · 581 阅读 · 0 评论 -
二维树状数组——计蒜客教程记录
算法的实际含义其实就是一维树状数组的展开,其可以参照之前写的树状数组博客分为两个部分:1、以下是单点修改,面积区间查询的代码void change(int i, int j, int delta){ ///A[i][j] += delta; 实际上不需要写出A[][]的结构 for(int x = i; x < A.length; x += lowbit(x)) ...原创 2019-04-06 11:17:02 · 116 阅读 · 0 评论 -
习题:奇怪的报数游戏
思路其中二分法就是用来判断左右还剩 几个位置 ,是不是比每个人报的数大,大的话就填进去。像这个题目,可以先用暴力想一想该怎么做,然后用区间数据结构来解决比如这道题:代码#include<bits/stdc++.h>using namespace std;const int MAX_N = 500050;int C[MAX_N+5],Rank[MAX_N],a[MA...原创 2019-03-27 20:52:24 · 314 阅读 · 0 评论 -
习题:校长的问题
题目:校长的问题询问的是[1 ~ a]排列中有多少个排名小于等于b的个数,一般这样的问题都是维护每个数字出现多少次的树状数组,只要把后面的数都加上1就可。(其实就是访问到一个数字后,在这个数字对应区间加1,在后面询问的时候就询问1~q(询问值)即可)而这道题有另外一个问题,询问访问的位置不规律。则将访问点a进行排序。每过一点维护一次树状数组,一直维护到当访问排序a,用getsum求出其在1~a...原创 2019-03-27 19:44:13 · 343 阅读 · 0 评论 -
树状数组维护区间最大值
作者:肘子zhouzi来源:CSDN原文:https://blog.csdn.net/zhouzi2018/article/details/81108940树状数组维护区间最大值,这个只支持末尾插入修改,每一次维护和查询的时间复杂度都是O((logn)^2),但这是满打满算的时间复杂度。假设是要维护和查询区间的最大值(最小值将max改成min 就好了)这个算法和树状数组维护和查询区间和的方法...转载 2019-04-05 18:47:08 · 560 阅读 · 0 评论 -
E. Painting the Fence——东二(双端队列,区间线段树)
题目地址:http://codeforces.com/gym/101911/problem/E这是一道好的算法组合题,涉及线段树以及双端队列。做完这道题,先写收获:1、差分树状数组(用于区间修改)不能处理区间统一换成数值v的问题(对我而言),只能简单的用作区间加减乘除运算。2、在维护线段树区间的元素的数量的时候,以及其他统计运算的时候,最优思想不应该是将统计元素数量(以及其他需求)整合到...原创 2019-04-05 18:15:54 · 251 阅读 · 0 评论 -
计蒜客习题:黑白石头
这道题目不知道从哪里开始分析先给出所用函数与数据结构吧函数1、up向上传递。由此题可以加深向上传递的理解:向上传递,就是两个区间合并,并将相应信息合并的函数。2、down向下传递(lazy标记传递)当父节点存在lazy标记时,将两棵树交换信息。记得添加子节点的lazy标记3、build构建区间长度线段树以及区间线段树初始化。用处:维护len(区间长度)线段树;初始化4、modify区...原创 2019-03-24 17:00:13 · 293 阅读 · 1 评论 -
差分树状数组
运用到的数学思想:一假设现在有一个原数组a(假设a[0] = 0),有一个数组d,d[i] = a[i] - a[i-1],那么a[i] = d[1] + d[2] + … + d[i]d数组就是差分数组所以求a[i]就可以用树状数组维护d[i]的前缀和即维护的是d[i]的树状数组上面的数学思想可以实现区间修改,以及单点查询。下附上代码:区间修改(1~n)void change...原创 2019-03-26 21:21:29 · 965 阅读 · 0 评论 -
[kuangbin带你飞]专题七 线段树题解
这里是分割线题目尚且没有补完,仅先开此博客。原创 2019-05-11 13:28:28 · 450 阅读 · 0 评论