标签:莫队 原理 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