最大子序和 單調列隊

2021-08-31 07:02:26 字數 773 閱讀 6397

acm題集:

最大子序和

題目:基本資料結構」例題/1201 最大子序和

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

單調列隊,表示下標上公升,對應的字首和也遞增的列隊。

列隊中儲存的是字首和的下標。

由於求的是連續不超過m的最大自序和。所以列隊的左端(隊頭),儲存的下標不能小於i-m,i表示當前遍歷的字首和的下標。

對於本問題,找到乙個左端點 j,其中j屬於[i-m,i-1]並且s[j]最小。

不妨比較一下任意兩個位置j,k,如果k=s[j],那麼對於所有大於等於i的右端點,k永遠不會成為最優選擇。因為s[k]不小於s[j],而且j離得比i遠,長度更不容易超過m,即j的生存能力比k更強。所以當這樣乙個j出現了的時候,k就完全是乙個無用的位置了。

#include

#define ll long long

#define fo(i,j,n) for(register int i=j; i<=n; ++i)

using

namespace std;

int q[

300005

],sum[

300005

],a[

300005];

int n,m;

void

solve()

cout<}int

main()

solve()

;return0;

}

最大子序和 單調佇列

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

JOI(TYVJ)最大子序和 DP 單調佇列

輸入乙個長度為n的整數序列,從中找出一段不超過m的連續子串行,使得整個序列的和最大。例如 1,3,5,1,2,3 當m 4時,s 5 1 2 3 7 當m 2或m 3時,s 5 1 6 計算區間和的問題一般用字首和表示。先用s i 表示序列中前i項的和,然後s i s j 1 就可以表示i j的和 ...

單調佇列簡單應用 最大子序和

description 輸入乙個長度為n的整數序列,從中找出一段不超過m的連續子串行,使得整個序列的和最大。例如 1,3,5,1,2,3 當m 4時,s 5 1 2 3 7 當m 2或m 3時,s 5 1 6。input 第一行兩個數n,m n,m 300000 第二行有n個數,要求在n個數找到最大...