线段树基础题目解析

放肆的年华 提交于 2020-02-19 17:23:45

一般的模板:区间加乘改,求区间极大 / 极小 / 和

  线段树模板 1:区间加,求区间和 / 最大 / 最小

    区间里的元素如果逐个修改就太慢了,所以考虑更快的方式——“懒惰标记”。

    对于一个区间,只需要在下传时,遇到一个完整区间就标记并退出,并对走过的区间进行懒标记。

    查询的时候,再在求和之前把懒标记加回来,就可以实现求和。

  线段树模板 2:区间加,区间乘,求区间和 / 最大 / 最小

    对于这种情况,标记下传的操作需要进行修改。

    原来,做一次加法只需要这个区间的和懒标记加上这个值,并且让这个区间的求和数组加上这个数的值*区间长度

    但是现在,又多了一个乘法懒标记,在实现区间加、区间乘操作时会麻烦一些:

    •     乘法懒标记数组清空时要赋值 1;
    •     区间加时,不用任何改动;
    •     区间乘时,不仅求和数组和乘法懒标记要乘上这个数,连加法懒标记也要乘上它才可以。

  线段树模板 3:区间加,区间改,求区间和 / 最大 / 最小

    区间改可以无视之前做过的任何操作,所以区间改时所有的懒惰标记都要改,当修改懒标记没有存储数时,最好存 -1 或不出现的数。

线段树趣题

  ① 01 数列区间异或,区间求和

    区间异或其实也不会难,只需要碰到完整的区间时将整个区间的和改成区间长度 - 原区间和,其它类似于上面的题目。

  ② 线段树 + 数学内容

    题意大致如下:

      给定一个长度为 $n$ 的数列 $A_1,A_2,...,A_n$,有 $m$ 种操作,每次操作给出操作区间端点 $l,r$:

        1. 随机打乱下标在 $[l,r]$ 之间的所有数的值;

        2. 求 $\sum_{i=l}^r A_i$ 的期望值对 $10^9+7$ 取模。

    解析:

      观察 “打乱” 操作,因为是随机的,所以最后取出的每个数的期望值都是相同的。

      但这串数的和是固定的,所以随机打乱后,每个数的期望值就是原区间的平均数。

      这题求和时有模数,所以处理平均数时可以用逆元。

      然后这题就变成了区间修改、区间求和的模板题。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!