题目
思路
真的,@Kelin 的博客写的太好了,我的脑海中只有一句话:公屏们,把兄弟打在害怕上!
离线算法
离线算法,可以考虑 莫队
。尽管离线还没有在线快
每个点向左边第一个比自己小的点连边,权值为 a x ( x − y ) a_x(x-y) ax(x−y) ,就形成了树形结构。
对于一个区间 [ l , r ] [l,r] [l,r] ,其最小值的下标为 p p p ,考虑 [ l , r + 1 ] [l,r+1] [l,r+1] 与 [ l , r ] [l,r] [l,r] 答案之差,即 [ x , r + 1 ] [x,r+1] [x,r+1] 的最小值之和。
x ∈ [ l , p ] x\in[l,p] x∈[l,p] 时,值为 a p a_p ap ; x ∈ ( p , r ] x\in(p,r] x∈(p,r] 内时,就是树形结构上的 一条链,差分即可。毕竟一定存在 x x x ,其父节点为 p p p ,毕竟 p p p 是最小值。所以,用 f ( x ) f(x) f(x) 表示从 x x x 到这颗“树”的根的边权之和,很好做了。
左边是一样的。这颗“树”可以用单调栈 O ( n ) \mathcal O(n) O(n) 预处理,找最小值用 R M Q RMQ RMQ ,复杂度 O ( n n ) \mathcal O(n\sqrt n) O(nn) 。
在线算法
模仿 离线算法
,我们找到最小值
p
p
p ,左端点在
[
l
,
p
]
[l,p]
[l,p] 、右端点在
[
p
,
r
]
[p,r]
[p,r] 中,可以计算数量,贡献都是
a
p
a_p
ap 。
对于不经过 p p p 的,譬如,右端点为 r 0 r_0 r0 、左端点在 ( p , r 0 ] (p,r_0] (p,r0] 中,我们就可以用上面得到的树上差分。
左边怎么办?再建一棵树就是了,相当于找,左端点固定,右端点哪里取。
这是很多条链,但是 ∑ i = p + 1 r [ f ( i ) − f ( p ) ] = ∑ i = p + 1 r f ( i ) − ( r − p ) f ( p ) \sum_{i=p+1}^{r}[f(i)-f(p)]=\sum_{i=p+1}^{r}f(i)-(r-p)f(p) ∑i=p+1r[f(i)−f(p)]=∑i=p+1rf(i)−(r−p)f(p) ,前缀和即可。
时间复杂度 O ( \mathcal O( O(找最小值 ) ) )。可以用 RMQ标准算法,复杂度就是预处理 O ( n ) \mathcal O(n) O(n) 、在线查询 O ( 1 ) \mathcal O(1) O(1) 的了!
代码
但是 RMQ标准算法
太难打了……弃坑。