最大子序和(優先佇列 字首和)

2021-10-10 17:58:57 字數 712 閱讀 6655

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

先用s um

[]

sumsu

m[]存一下序列的字首和

我們需要找到乙個最大的sum

[r]−

sum[

l](r

−l

<=m

)sum[r]-sum[l](r-l<=m)

sum[r]

−sum

[l](

r−l<=m

)拿雙端佇列維護

最優解的情況就是下標遞增,sum

[]

sumsu

m[]也遞增才可以

int a[maxn]

,sum[maxn]

;deque<

int>q;

intmain()

q.push_back(0

);int ans=

-inf;

for(

int i=

1;i<=n;i++)if

(q.size()

)while

(q.size()

&&sum[q.

back()

]>=sum[i]

) q.

push_back

(i);

} cout<}

佇列 最大子序和

1 n,m 300000 輸入樣例 6 41 3 5 1 2 3 輸出樣例 7思路 顯然我們要在字首和陣列中sum i 的前m範圍內找到乙個min,那麼以第i個數結尾的m個連續元素的序列的最大子序和就是這個sum i min 最後就只需要遍歷一遍尋找答案啦。顯然在尋找min的時候我們也可以迴圈列舉,...

最大子序和 單調佇列

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

演算法競賽高階指南 最大子序和 字首和 單調佇列

輸入乙個長度為n的整數序列,從中找出一段不超過m的連續子串行,使得整個序列的和最大。第一行兩個數n,m n,m 300000 第二行有n個數,要求在m個數內找到最大子序和 乙個數,數出他們的最大子序和 641 351 237這道題相當於求區間和最大,那可以考慮字首和相減。單調佇列可用於求區間最值問題...