[kuangbin带你飞]专题七 线段树
Contents
1. HDU1166 敌兵布阵
题意:单点更新+区间查询(求和)。
树状数组 (218ms)
|
|
线段树 (234ms)
|
|
zkw(张昆玮) 线段树 (202ms)
|
|
2. HDU1754 I Hate It
题意:单点更新+区间查询(最值)。
模板题。
|
|
3. POJ3468 A Simple Problem with Integers
题意:区间更新+区间查询(求和)。
模板题,延迟标记。
|
|
4. POJ2528 Mayor’s posters
题意:市长选举贴高度相同的海报,后面的海报可以贴在前面的上面,最后可以看见的海报。
离散化用线段树,注意对于如 $[1,10],[1,4],[6,10]$ 等端点重合的样例,离散化将 5 压缩掉,因此需要在距离大于 1 的点中进行插点,不影响最终结果,在 $2 * N$ 个点中插点,最多 $4 * N-1$,因此取 $N=4e4$。
|
|
5. HDU1698 Just a Hook
题意:区间更新+所有数的和。
延迟标记,最后输出 tree[1].sum
即可。
|
|
6. ZOJ1610 Count the Colors
题意:区间涂色(可覆盖),求最终可看到几种颜色,以及这些颜色的段数。
类似于第四题,延迟标记。
|
|
7. POJ3264 Balanced Lineup
题意:农夫 Jorn 的 n 中奶牛排成一列,q 个查询,输出区间最大高度差。
树状数组
|
|
线段树
|
|
8. HDU4027 Can you answer these queries?
题意:区间修改(开方)+区间查询(求和)。
每个点更新不一样,只能单点修改,由于 $2^{64}$ 开 7 次方取整为 1,故还可加限制条件每个点最多更新 7 次,以及区间和等于区间长度时不需继续更新,注意输入数组不开 long long
会 TLE。
|
|
9. HDU1540 Tunnel Warfare
题意:n 个地道,m 个操作,D x
: 炸掉第 x 个地道;Q x
: 查询第 x 个地道所在的最大区间长度;R x: 重建上一次被炸的地道。
法一:线段树维护三个信息,ll: 左端点开始最大连续长度,rl: 右端点开始最大连续长度,ml: 区间中最大连续长度。
|
|
法二:线段树维护区间中被摧毁村庄编号的最值。
|
|
法三:类似法二的思想,模拟来做。
|
|
10. HDU3974 Assign the task
题意:n 个结点,n-1 个关系,所有结点初始值为 -1,给出 m 个操作,C x: 查询 x 结点的值,T x y: 以 x 为根的子树上所有结点值变成 y。
dfs 找出树的 dfs 序,找出每个数字左右两边出现的位置,子结点必在两个位置之间,之后用线段树即可。
|
|
11. HDU4578 Transformation
题意:给定一个长度为 n 的序列,有 4 种操作:
1 x y c
[x, y] 上的值全部加 c2 x y c
[x, y] 上的值全部乘 c3 x y c
[x, y] 上的值全部赋为 c4 x y p
[x, y] 上的值的 p 次方和
线段树维护延迟标记 加(add), 乘(mul),以及 sum[i] 表示 i 次方的和,更新时考虑 add、mul 对 sum[i] 的影响
乘法:
- $sum[i] = v ^ i * sum[i]$
加法
- $sum[3] = sum[3] + 3v^2 * sum[1] + 3v * sum[2] + len * v^3$
- $sum[2] = sum[2] + 2v * sum[2] + len * v^2$
- $sum[1] = sum[1] + len * v$
其中 len 为当前区间的长度。
|
|
12. HDU4614 Vases and Flowers
题意:有 n 个空花瓶 $0\sim n-1$,m 个操作:1 x y
: 从 x 位置插 y 多花,有花的花瓶跳过,到最后一个花瓶还有剩余,丢弃剩余花;2 x y
: 将区间 $[x,y]$的花瓶清空。对 1 操作,输出第一个和最后一个插花的位置,如果一朵花都插不了,输出 ‘Can not put any one.’;对 2 操作,输出区间 $[x,y]$ 内被清空的花瓶数量。
线段树维护区间空花瓶数 num 和一个延迟标记 tag,对操作 1,判断所求区间空花瓶数大于 0,区间空花瓶递增,可二分找到第一个和最后一个插花位置,将两个位置间 num 置 0;对操作 2,输出总数减空花瓶数,之后区间 num 置为区间长度。
|
|
13. HDU4553 约会安排
题意:长度为 n 的区间,m 个操作:D x
: 请求占用长度为 x 的连续区间,返回区间开始位置;N x
: 请求占用长度为 x 的连续区间,如果没找到,可以忽略 D 的请求再寻找;S x y
: 清空 [x, y] 占用部分。
建 2 棵线段树维护最长连续区间,分别表示只有女神,以及既可以屌丝又可以女神,函数增加表示线段树的参数,注意输出标点符号是英文的。
|
|
扫描线
接下来几题会涉及到扫描线,建议先学习 OIWiki-扫描线
14. POJ1177 Picture
题意:求 n 个矩形的周长并。
扫描线经典题。线段按 y 升序排序,按照 x 轴建立线段树,线段树维护区间完全覆盖次数 cnt,连续区间个数 num,覆盖长度 len,左右端点是否覆盖 lf、rf。
|
|
15. HDU1255 覆盖的面积
题意:$n(1\le n\le1000)$ 个矩形,求覆盖 2 次及以上的矩形面积并。
稍微修改一下扫描线模板,维护结点被竖直线段完全覆盖次数 cnt,覆盖一次 x 方向长度 len1, 覆盖 2 次及以上 x 方向长度 len2。
|
|
16. HDU1542 Atlantis
题意:求 $n(1\le n\le 100)$ 个矩形的面积并。
看这张别人画的图就明白了
|
|
17. HDU3642 Get The Treasury
题意:$n(1\le n\le1000)$ 个长方体,求相交 3 次及以上部分的体积。
$z\in[-500,500]$,枚举 $z_i$ 在 $[z_i,z_{i+1})$ 用扫描线转化为二维。
|
|