原题地址
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 到