演算法競賽高階指南 0x12 最大子序和

2021-10-19 18:25:56 字數 886 閱讀 1482

這其實是一道單調佇列優化區間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 實現的過程類似於倒過來的分治 當然也可以直...