码迷,mamicode.com
首页 > 其他好文 > 详细

【BZOJ】

时间:2017-08-04 12:44:01      阅读:88      评论:0      收藏:0      [点我收藏+]

标签:取出   子串   max   题解   sum   rmq   坐标   转化   st表   

【算法】堆+贪心+RMQ

【题解】

考虑暴力是把所有满足要求的子串算出答案,取前k小的,O(n^2)。

考虑优化,将左端点为x,右端点为x+L-1~x+R-1的子串视为一类。

所以定义三元组(x,l,r)为一类,其中l=x+L-1,r=x+r-1。

在一类中我们第一步应该取一类中的最大值,即取max(sum[l~y]),l<=y<=r。

max(sum[l~y])转化为求max(sum[1~y]-sum[1~l]),显然一类中sum[1~l]相同消去,即求max(sum[1~y]),维护前缀和并用RMQ的ST表O(1)查询。

所以定义三元组(x,l,r)的值为max,坐标为y,按值加入堆。

取出三元组(x,l,r)后加入两个三元组(x,l,y-1)和(x,y+1,r)。

本题的特点是利用同一类可以O(1)求答案来优化的。

【BZOJ】

标签:取出   子串   max   题解   sum   rmq   坐标   转化   st表   

原文地址:http://www.cnblogs.com/onioncyc/p/7284328.html

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