码迷,mamicode.com
首页 > 编程语言 > 详细

BZOJ 4540 [Hnoi2016]序列 (单调栈+ST表+莫队算法)

时间:2017-10-06 00:01:44      阅读:255      评论:0      收藏:0      [点我收藏+]

标签:莫队   原理   online   时间   lin   这一   target   hnoi   problem   

题目链接  BZOJ4540

考虑莫队算法。

这题难在[l, r]到[l, r+1]的转移。

根据莫队算法的原理,这个时候答案应该加上

$cal(l, r + 1) + cal(l + 1, r + 1) + cal(l + 2, r + 1) + ... + cal(r + 1, r + 1)$

$cal(l, r)$表示$a[l], a[l+1], a[l+2], ..., a[r]$中的最小值。

我们先求出[l, r +1] 这些数中的最小值a[x]

那么$cal(l, r + 1) + cal(l + 1, r + 1) + cal(l + 2, r + 1) + ... + cal(x, r + 1)$这一部分就解决了

这一部分的值为$(x - l + 1) * a[x]$

剩下还有一部分$cal(x + 1, r + 1) + cal(x + 2, r + 1) + ... + cal(r + 1, r + 1)$

考虑用单调栈求出两个数组lc[], rc[]。

lc[i]表示a[i]左边第一个小于a[i]的数的位置(如果没有则为0)

rc[i]表示a[i]右边第一个小于a[i]的数的位置(如果没有则为n+1)

然后我们维护两个序列s1[], s2[]

$s1[i] = s1[lc[i]] + (i - lc[i]) * a[i]$

刚刚那个剩余的情况中,$s1[r+1] - s1[x]$即为这部分的答案。

因为满足$a[r+1]>=a[x]$,所以对于$a[r+1]$来说,他往左不断找第一个小于他的数,

肯定能在某一步找到$a[x]$.

而我们维护s1[]的目的就是把这个跳的过程做到O(1).

转移就是这样

那么另外三种情况也差不多,以此类推。

时间复杂度$O(n^{\frac{3}{2}})$

BZOJ 4540 [Hnoi2016]序列 (单调栈+ST表+莫队算法)

标签:莫队   原理   online   时间   lin   这一   target   hnoi   problem   

原文地址:http://www.cnblogs.com/cxhscst2/p/7630291.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!