LOJ#2019. 「AHOI / HNOI2017」影魔

题意:
在一个序列中 如果有一个子区间
它有一个端点是区间最大值 另一个端点不是这个区间的次大值 就会有p2的贡献
它两个端点分别是最大值次大值 就会有p1的贡献

我们发现这两个条件有一个重合的部分
即区间有一个端点是最大值

再次拆分问题
如果我们只考虑这个区间的左端点是最大值
那么我们可以记录每个节点i右边第一个大于它的值的位置R[i]
那么左端点为i的满足条件的区间有[i, i], [i, i + 1], ..... , [i, R[i] - 1]

第一步展开
如果求右端点是最大值的子区间数时
记录每个数左边第一个大于它的值的位置L[i] 仿照上面的步骤即可

上述左右方向计数 [i, i]会被重复计数需要除去
现在我们可以O(n)统计总的满足至少一个端点是最大值的区间数了

你有没有犹疑过部分数据 那个p1 = 2 * p2是什么鬼?
你把右端点最大区间按[i, i], .... , [i, R[i]]计数
左端点最大区间同理 会发现满足p2条件区间刚好被计数了一次
满足p1条件的区间刚好被计数了两次
我们只要在原来答案的起初上+ p1 - 2p2就改回来了

转载于:https://www.cnblogs.com/hjmmm/p/9498252.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值