随笔- 106  文章- 0  评论- 0  阅读- 27589 

RMQ问题:区间最大值或者最小值问题,类似的还要区间和问题

操作:

(1)求最值 、求和:区间内

(2)修改元素 :点修改、区间修改

线段树:用于区间处理的数据结构,用二叉树构造

二叉折半查找,查找点或者区间的时候:顺着往下查找 。存储空间:4n

修改点:直接修改叶子节点,然后自底向上更新

修改区间:使用lazy标记,加上pushdown函数,更新区间的lazy标记

复杂度:O(nlogn),线段是把n个数按照二叉树进行分组,每次更新有关节点的时候,这个节点下面的所有子节点都隐含被更新了,从而减少了操作次数

last cows

第一种做法:用结构体实现线段树

第二种做法:完全二叉树(数组)

当数据太大:也可以考虑离散化,把原有的大二叉树压缩为小二叉树,但是压缩前后子区间的关系不变

区间修改

操作:(1)加 (2)查询和

lazy_tag方法:当修改一个整块区间时,只对这个线段区间进行整体上的修改,其内部每个元素内容先不修改,只有当这部分线段的一致性被破坏时才把变化之传给子区间(查询时也一样)

tag[]数组:记录节点i是否用到lazy原理,其值是op a b c中的c,如果做了多次lazy,那么add[]可以累加,如果在某次操作中被深入, 破坏了lazy,那么add[]归0

1548:【例 2】A Simple Problem with Integers(线段树的做法)

 

1547:【 例 1】区间和

点修改、区间求和 

  

1548:【例 2】A Simple Problem with Integers  (树状数组做的)

区间修改(加上x),区间求和

可以用线段树、也可以用树状数组
感觉线段树简单一点,但是不好推
用树状数组讲解:维护两个前缀和
https://blog.csdn.net/gzcszzx/article/details/100539427
维护两个前缀和,
S1[i]=d[i],S2[i]=d[i]*i
查询:位置Pos的前缀和就是(Pos+1)*S1中1到Pos的和 减去 S2中1到Pos的和,[L,R]=SS[R]-SS[L-1]

修改:[L,R]
S1:S1[L]+Tag,S1[R+1]-Tag
S2:S2[L]+Tag*L ,S2[R+1]-Tag*(R+1)

  

1549:最大数

 

修改:在序列最后添加数

查询:最后L个数种最大数

单点更新,区间查询

这道题也有两种做法
//但是有一种是单调队列,另一种是线段树
//开始时创建一个大序列,全部设为 2147483647。每插入一个数,就将大序列中空闲部分的第一个数改为被插入的数,然后递归更新上层。复杂度O(nlog2n)。

 原文链接:https://blog.csdn.net/sinat_34943123/article/details/53861325

单调队列的做法:

线段树做法:

  

1550:花神游历各国

//区间修改、区间查询
//并且变化很神奇,l--r中每个国家的喜欢度变为sqrt()

注意要处理节点的值不断sqrt()后的变化,要特判是不是1或者0  mx[root]==1||mx[root]==0

需要数组:mx[maxn*4],summ[maxn*4],num[maxn],分别存储左右孩子最大值、总和、这个节点的值

  

1551:维护序列

是区间修改,区间求和
//但是修改有两种方式:1、全部乘一个值 2、全部加一个值
//https://www.cnblogs.com/lher/p/6556238.html
//https://blog.csdn.net/weixin_43323172/article/details/99689300

经典线段树题目,同时有两个标记,一个加法标记,一个乘法标记,每个标记维护的意义为:下面的子树中,要先把每一项都乘以乘法标记,再加上加法标记。

设序列A = {a1,a2,a3,…,an},如果每一项先乘以p1,则序列变为{p1*a1,p1*a2,p1*a3,...,p1*an},再加上p2,则序列变为{p1*a1+p2,p1*a2+p2,p1*a3+p2,...,p1*an+p2},
再乘以p3,则序列变为{p1*p3*a1+p2*p3,p1*p3*a2+p2*p3,p1*p3*a3+p2*p3,...,p1*p3*an+p2*p3}。
由此可见,在添加标记或者下放标记合并时,
若新加乘法标记,则原有的乘法标记,加法标记和区间和都乘以新加的乘法标记,
若新加加法标记,则与前面的乘法标记无关,直接加在加法标记上,区间和加上区间长度*加法标记。

  

 

 
 posted on   shirlybabyyy  阅读(329)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示