Acwing135 最大子序和

2021-10-02 07:53:29 字數 1008 閱讀 3262

輸入乙個長度為n的整數序列,從中找出一段長度不超過m的連續子串行,使得子串行中所有數的和最大。

注意: 子串行的長度至少是1。

輸入格式

第一行輸入兩個整數n,m。

第二行輸入n個數,代表長度為n的整數序列。

同一行數之間用空格隔開。

輸出格式

輸出乙個整數,代表該序列的最大子序和。

資料範圍

1≤n,m≤3000001≤n,m≤300000

輸入樣例:

6 41 -3 5 1 -2 3

輸出樣例:

7字首和直接列舉o(n^2)會超時,所以用單調佇列來做。對於三個下標k=sum(j),即存在 sum(i)-sum(k)<=sum(i)-sum(j) 所以可以排除k,由此種思想可以得出做法:

1.每個下標都需要入佇列

2.每個下標入佇列時需要排除佇列裡面的「k」

(由於單調佇列公升序排序,所以從末尾開始向前刪除就可以)

3.如果佇列超出m大小,需要刪除成員

這樣每次只需要計算佇列頭的元素的字首和,即複雜度到達了o(n)

(由於單調佇列公升序排序,所以佇列頭的字首和之差最大,由於每次 i 的更替,需要每次都計算字首和差)

實質:計算出每個 下標 的在[m,i]內的最大和

#include

#include

using

namespace std;

int a[

300010

],q[

300010];

intmain()

int ans=

-0x3f3f3f

;int l=

1,r=1;

for(

int i=

1;i<=n;i++

) cout

}

AcWing 135 最大子序和

acwing 135.最大子序和 大佬講解 原題解鏈結見文末 單調佇列 o n 首先單調佇列,不同一般的佇列,他需要的stl是deque 雙端佇列,因為我們要支援隊頭插入和隊尾插入.單調佇列做法大致如下 首先我們需要找到單調性,這道題目的顯而易見.我們知道區間和的做法,一般都是字首和,而字首和的求法...

AcWing 135 最大子序和

輸入乙個長度為n的整數序列,從中找出一段長度不超過m的連續子串行,使得子串行中所有數的和最大。注意 子串行的長度至少是1。輸入格式 第一行輸入兩個整數n,m。第二行輸入n個數,代表長度為n的整數序列。同一行數之間用空格隔開。輸出格式 輸出乙個整數,代表該序列的最大子序和。資料範圍 1 n,m 300...

AcWing135 最大子序和

link 陣列沒開夠,爆零兩行淚 longlong開成int,爆零兩行淚 多組忘清空,爆零兩行淚 dp 沒初值,爆零兩行淚 深搜沒邊界,爆零兩行淚 廣搜忘出隊,爆零兩行淚 輸入沒加 爆零兩行淚 模數沒看見,爆零兩行淚 1 不輸出,爆零兩行淚 越界不特判,爆零兩行淚 線段樹開一倍,爆零兩行淚 無向變有...