(线段树)洛谷 P2471 [SCOI2007]降雨量

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

原题地址

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。)

  1. x \textit{x} x y \textit{y} y 倒置/相同的话 false \textit{false} false

  2. 若给出的年份不全在我们已知的查询区间内,即经离散化之后不在 1 \textit{1} 1 n \textit{n} n 之间,那么拿出来单独讨论。(就是这个地方调了整整两天qwq)

    这样,除了 false \textit{false} false 就是

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值