這其實是一道單調佇列優化區間dp問題,對於這個序列,我們可以劃分為n個區間,每個區間代表以ai結尾,長度不超過m的子串行和,我們只需要遍歷一遍每個集合,找到每乙個集合中的最大值,那麼就可以更新出這個序列的最大值
如何找每個集合中的最大值呢,最大值就是要求出以a[k]結尾,長度不超過m的子串行和最大,求區間和我們可以用字首和,s[k]-s[k-j] (1<=j<=m) ,要想使所求值最大,那麼就要使s[k-j]最小 ,所以問題就轉化成求乙個滑動區間的最小值問題,我們就可以用單調佇列做優化
#include
#include
#include
#include
#include
using
namespace std;
const
int n =
3e5+10;
const
int inf =
0x3f3f3f3f
;int n, m;
int s[n]
, q[n]
;int
main()
int hh =
0, tt =-1
; q[
++tt]=0
;int res =
-inf;
for(
int i =
1; i <= n; i++
) cout << res << endl;
return0;
}
演算法競賽高階指南 0x12 佇列 蚯蚓
m次操作,每次都要將乙個最大的切成兩段,然後再加上乙個偏移量,然後將兩段全部放入佇列中,但是這樣是o mlogm 看題中資料範圍肯定會超時,那麼我就要繼續優化 我們可以發現,先將原序列從大到小排列 q1,q2,q3,q4 第一次肯定是切割q1,假設將q1切成了q1l,q1r,那麼對於第二次切割只需要...
《演算法競賽高階指南》0x12 T4 最大子序和
題目傳送門 輸入乙個長度為 n nn 的整數序列,從中找出一段長度不超過 m mm 的連續子串行,使得子串行中所有數的和最大。注意 子串行的長度至少是 111。第一行輸入兩個整數 n nn mmm。第二行輸入 n nn 個數,代表長度為 n nn 的整數序列。同一行數之間用空格隔開。輸出乙個整數,代...
演算法競賽高階指南 0x00
快速冪模板,寫一下快速冪的原理。我們知道,乙個數 n 在二進位制 也可以是其他進製 下可以被表示為 a 1 a 2 2 1 a 3 2 2 a m 2 那麼我們可以考慮將其分拆成二進位制狀態下的每一位,然後做冪運算。這樣做的時間複雜度為 o log 2 n 實現的過程類似於倒過來的分治 當然也可以直...