原题地址
https://www.luogu.com.cn/problem/P2471
解题思路
准备
好像只有我维护了两棵线段树?
先定义一个 rain \textit{rain} rain 数组存放降雨量,默认值为大于降雨量最大值的数 INT \textit{INT} INT_ M \textit{M} M。
一开始读入的时候对每个年份进行离散化处理,按照第一个年份对应 1 \textit{1} 1,得到 n \textit{n} n 个年份,对应的降雨量值存入 rain \textit{rain} rain 数组。
注意:这里 1 \textit{1} 1 到 n \textit{n} n 之间可能有的年份没有读入值,即不确定,它们对应的值即为 INT \textit{INT} INT_ M \textit{M} M。
之后维护两棵线段树 sum \textit{sum} sum 和 realSum \textit{realSum} realSum,均是用于维护区间降雨量的最大值。
不同的是:
sum \textit{sum} sum 维护时,降雨量按照 rain \textit{rain} rain 初始处理好的值来进行,即若查询区间内存在不确定降雨量的年份,那么返回的值必定是 INT \textit{INT} INT_ M \textit{M} M。
而 realSum \textit{realSum} realSum 按照真实的值来进行维护,即返回区间已确定年份的最大值。
(本质都是二分查找,就是写成线段树自己方便理解…)
讨论
那么接下来就到了激动人心的讨论环节,不得不说好多好多细节要注意…那么我们一个一个来。
分析步骤:
(以下内容与代码一致,将前面输入的年份称作 x \textit{x} x,后面的称作 y \textit{y} y,其降雨量分别为 xx \textit{xx} xx 和 yy \textit{yy} yy,年份离散化后的值为 posx \textit{posx} posx 和 posy \textit{posy} posy。)
-
x \textit{x} x 和 y \textit{y} y 倒置/相同的话 false \textit{false} false。
-
若给出的年份不全在我们已知的查询区间内,即经离散化之后不在 1 \textit{1} 1 到 n \textit{n} n 之间,那么拿出来单独讨论。(就是这个地方调了整整两天qwq)
这样,除了 false \textit{false} false 就是

博客详细探讨了如何使用线段树解决洛谷P2471 [SCOI2007]降雨量问题。首先对年份进行离散化处理,维护两棵线段树sum和realSum,分别用于区间最大值的不确定和确定情况。文章重点在于讨论各种边界情况和细节处理,包括年份不在查询区间、年份相邻以及已知年份的最大值比较等,帮助读者理解线段树在处理此类问题中的应用。
最低0.47元/天 解锁文章
176

被折叠的 条评论
为什么被折叠?



