Codeforces 1042 D Petya and Array

1.题意

给出一个数组,元素有正有负有0,问其区间和大于K的子区间的个数。

2.解法

若直接求所有区间和,有n^2个状态,显然是要直接略过一些状态。
对这类问题,解决方法一般是排序——利用单调性,在处理到某个状态时不和要求,则其后的状态也不合要求,continue。

对于本题,有个技巧:我们运用二分。对于[l,r]之间的子区间,我们只考虑跨越区间中点mid的子区间。
首先,我们要从mid开始向左构造后缀和suf,向右构造前缀和pre,进而通过任意的suf+pre产生一个区间和。
然后,我们把suf和pre们按照升序排序。
道理是很清晰的,既然任一suf+任一pre都能产生一个经过mid的子区间的区间和,我们必然希望让suf和pre都尽可能小,直到suf+pre达到阈值K——那余下的suf+pre也必然大于K,便不做考虑。

核心思路就是利用单调性忽略部分状态。

3.代码

注意有数字超过INT_MAX,要用longlong。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值