[HNOI2016]序列

题目

传送门 to BZOJ

传送门 to luogu

思路

真的,@Kelin 的博客写的太好了,我的脑海中只有一句话:公屏们,把兄弟打在害怕上

离线算法

离线算法,可以考虑 莫队尽管离线还没有在线快

每个点向左边第一个比自己小的点连边,权值为 a x ( x − y ) a_x(x-y) ax(xy) ,就形成了树形结构。

对于一个区间 [ 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)(rp)f(p) ,前缀和即可。

时间复杂度 O ( \mathcal O( O(找最小值 ) ) )。可以用 RMQ标准算法,复杂度就是预处理 O ( n ) \mathcal O(n) O(n) 、在线查询 O ( 1 ) \mathcal O(1) O(1) 的了!

代码

但是 RMQ标准算法 太难打了……弃坑。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值