1. 程式人生 > >【BZOJ】

【BZOJ】

max 要求 -s 算法 所有 是把 rmq 坐標 bzoj

【算法】堆+貪心+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】