HDU--5575、Discover Water Tank (思维、优先队列)

本文介绍了一道关于水箱和隔板的数学问题,通过使用优先队列来解决。当隔板将水箱分成多个部分时,讨论了如何根据探测结果动态更新水位,并求解在所有探测中最多能有多少个是正确的。文章探讨了初始无水状态的答案,并解释了如何通过枚举水位高度来优化答案。在具体实现中,利用小根堆维护每个部分的水位信息,并在合并时使用启发式合并策略。此外,还提到了当时间复杂度受限时,可以考虑使用左偏树实现更快的优先队列合并操作。
摘要由CSDN通过智能技术生成

题目链接

题面:
在这里插入图片描述
题意:
有一个 1 ∗ n 1*n 1n 的水箱,水箱的四周的高度为无穷大。现在用 n − 1 n-1 n1 高度为 h i h_i hi 的隔板将水箱分为 n n n 1 ∗ 1 1*1 11 的部分。

隔板不透水,但是水的流动遵循一般的物理规律,即如果当前水位如果比某一侧的隔板要高,谁就会从一个部分流向另一个部分。

现在已知这 n n n 个部分某些部分可能有一定高度的水,进行 m m m 次探测,第 i i i 次探测以 x x x y y y z z z 的形式给出,如果 z = 0 z=0 z=0 ,说明第 x x x 个部分高度为 ( y + 0.5 ) (y+0.5) (y+0.5) 处没有水。如果 z = 1 z=1 z=1 ,说明第 x x x 个部分高度为 ( y + 0.5 ) (y+0.5) (y+0.5) 处有水。

但是不保证这 m m m 个查询一定正确,问这 m m m 个查询中最多有多少个是正确的。

题解:
考虑初始时,如果所有的部分都没有水,那么答案 a n s = ∑ [ z = 0 ] ans=\sum[z=0] ans=[z=0]

但是让一些部分有水以后,答案可能会更优。

我们从小到大枚举水的高度 y y y(向下取整)。

找到当前如果第 x x x 部分的水位高度为 y y y 时,需要找到往左往右扩展多少。即找到左边第一块高度大于 y y y 的板,右边第一块高度大于 y y y 的板,记这个区间为 [ l , r ] [l,r] [l,r]。如果当前 x x x 部分的水位高度为 y y y,那么 [ l , r ] [l,r] [l,r] 的水位高度也应该为 y y y。我们记 [ l , r ] [l,r] [l,r] 区间水位小于等于 y y y z = 0 z=0 z=0 的数量 c n t 1 cnt1 cnt1,这一部分由真变假。我们记 [ l , r ] [l,r] [l,r]区间水位小于等于 y y y z = 1 z=1 z=1 的数量为 c n t 2 cnt2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值