线段树专题练习
此篇包含尚未写完的题,事实上是一个TODO List。
TODO List
- Atlantis
- P5490 【模板】扫描线 & 矩形面积并 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
- I Hate It
- 覆盖的面积
- 敌兵布阵
- P4588 TJOI2018 数学计算 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
- 单峰数列 ✅ 2024-09-26
- 树上询问
- P1502 窗口的星星 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
- P2471 SCOI2007 降雨量 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
Atlantis & P5490 扫描线矩形面积并
题意
给出$x_1,y_1,x_2,y_2$,标志平面内的矩形的左上角坐标$(x_1,y_1)$和右下角坐标$(x_2,y_2)$,求这些矩形覆盖的总面积。
输出格式参照样例。
数据范围
- $0\leq n\leq 100$
- $0\leq x_1\lt x_2\leq 10^5$
- $0\leq y_1\lt y_2\leq 10^5$
思路
记录每个矩阵的上下边,并给下边沿标记$1$,上边沿标记$-1$,扫描线从下向上扫描。
记录每条线的左右端点的$x$坐标,去重后进行离散化,用$X[]$数组记录出现过的$x$坐标,并做去重。
在去重之后的$X[]$数组上建立线段树(不包含最右侧端点),线段树中的每个节点记录该段节点代表的线段的左右端点在$X[]$中的下标,之后若该线段被覆盖,该节点代表的长度就是$X[posr+1]- X[posl]$,初始时每个节点记录的长度都是$0$(初始时均未被覆盖)。
扫描线从下到上扫描,每次都是先遇到某个矩阵的下边沿(标记为$1$的边),然后再遇到上边沿(标记为$-1$的边)。对于每次加边,更新线段树上的节点,当前被覆盖的长度$\times$当前扫描线与下一条扫描线的高度差即为这一部分的面积。
代码
|
|
稍微修改一下上一题的代码就能过这个题:P5490 【模板】扫描线 & 矩形面积并 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
代码:
|
|
I Hate It
题意
老师想询问学生中从某某到某某分数最高的是多少,并支持修改单个学生的成绩。
数据范围
$0\lt n\leq 200000$
$0\lt m\leq 5000$
思路
建树,节点记录最大值,单点修改。注意多组读入
代码
|
|
覆盖的面积
题意
给定平面上的矩阵,求出被这些矩阵覆盖至少两次的区域面积。
数据范围
$1\leq N\leq 1000$
$0\leq x_i,y_i\leq 100000$
思路
扫描线求矩形并,在求并时统计更新被覆盖的次数,在pushup
的时候,当父节点已有一次覆盖,而子区间已经被包含一次,则子区间已经被包含了2次。
代码
|
|
敌兵布阵
题意
有$N$个营地,初始第$i$个营地有$a_i$个人,有$4$种命令。
Add i j
,表示第$i$个营地增加$j$人。Sub i j
,表示第$i$个营地减少$j$人。Query i j
,查询第$i$到第$j$个营地一共有多少人。End
,表示结束。
数据范围
- $N\leq 50000$
- $1\leq a_i\leq 50$
思路
很模板的一个题。
代码
|
|
单峰数列
题意
给定长度为$n$的数列$a$,支持以下操作:
1 l r x
:给区间$[l,r]$的所有数加上$x$2 l r
:查询区间$[l,r]$中的元素是否全都相同3 l r
:查询区间$[l,r]$中的元素是否严格上升,当$l==r$时认为是严格上升的4 l r
:查询区间$[l,r]$中的元素是否严格下降,当$l==r$时认为是严格下降的5 l r
:查询区间$[l,r]$是否是单峰数列,单峰数列符合右侧严格递增,左侧严格递减,并且左右侧的区间不为空,保证$r-l+1\geq 3$。
数据范围
- $3\leq n \leq 10^5$
- $0\leq a_i\leq 10^9$
- $1\leq q \leq 2\times 10^5$
对于第一类操作,保证$-10^9\leq x\leq 10^9$
思路
用三个变量记录区间左值、右值和懒标记。
用三个布尔值变量记录当前区间是否是相同、上升、下降、单峰。在判断合并后是否是单峰时,主要满足单峰的区间必须大于等于3,当左右两个区间分别是上升、下降,且某个区间只有一个数时,要注意比较左右值。
代码
|
|