发现以前会的好多算法现在都忘得差不多了。。。翻了翻以前写过的一些比较复杂的题目,发现现在真是两眼一抹黑。
准备有空重新开始刷一波题。
先开个线段树的专题吧。
整理了一下模版,快速过了 4 个典型例题。
经典例题
HDU1166
【线段树/树状数组】
单点更新,区间求和。
嗯,树状数组天生就是做这个的,没啥说的。
1 | /* *********************************************** |
线段树也是基础用法,不过说起来以前我写的线段树基本上都是用的结构体数组,压缩一下子节点的标记号增长方式可以把空间限制在 2N~3N 左右。
这次换了个模版,标号增长直接用的是二叉树倍增的方式,空间要浪费一点,需要开到 4N,不过拿掉了其他多余的东西(结构体等等),好像效果也还好。
1 | /* *********************************************** |
HDU1754
【线段树】
单点更新,区间求最值。
线段树基础用法。
1 | /* *********************************************** |
HDU1698
【线段树】
区间更新,区间求和。
修改区间的时候就要多加一个 lazy 标记,基础用法。
1 | /* *********************************************** |
HDU1556
【线段树/树状数组】
区间更新,单点求值。
这是最经典的线段覆盖问题。
单点求值的时候有点不同的是只要用到 lazy 标记就够了,沿着路径一路走到叶子结点,把一路上的 lazy 标记全部加起来就好。
1 | /* *********************************************** |
树状数组解法是把单点求值转化为求前缀和,把区间更新转化为两次单点更新即可。
每次要插一条区间的时候,在区间开头加一,区间结尾减一,这样下次求前缀和的时候就相当于原本的单点求值了。
1 | /* *********************************************** |
再深入一点
翻了下,博客里面以前记过一题,顺便也整理到这里来。然后还有几次以前比赛里面没补的题,看看能不能补一波。
HDU5172
不更新,但是区间判断的东西比较有意思。每次询问的是给个区间,假设区间长度是 n,问这个区间中的数字是不是刚好能从 1 排到 n。
HDU5023
14 年广州网赛的 B 题,当时没怎么写。
30 种颜色,每次用一种颜色涂一些线段,询问一段区间内有什么颜色,把颜色全部列出来。
内心OS:哇。。。这么基础的线段树染色题我当年在干什么。。。捂脸
1 | /* *********************************************** |
30 种颜色,用位运算可以很方便地表示出来。
嗯。。。下面的 H 题等下次什么时候想把树链剖分翻出来的时候再研究吧。