CH1201 最大子串行和

2022-08-03 02:24:14 字數 911 閱讀 6208

一道關於單調佇列的模板題。

題目要求求一段區間,使得這一段區間的和最大且區間長度不超過m。我們顯然想到了先求出這個序列的字首和sum,這樣我們就能用o(1)的時間查詢任意乙個子串行的和。

現在,我們列舉區間的右端點,對於每乙個右端點i,我們要找到乙個左端點j,使得sum[j]最小而且i-j≤m.

因此,我們維護乙個單調佇列q。佇列中儲存左端點的下標,按照此下標所對應的sum值單調遞增。當我們列舉到i時,我們檢查隊頭的元素(最靠左的下標)是否滿足題意(是否與i不超過m),將非法的下標出隊,對於當前的i,j就是隊頭的元素。我們更新一次答案。之後,我們刪除隊尾,直到隊尾對應的sum值小於sum[i],然後將i入隊。

1 #include 2 #include 3 #include 4 #include 5

using

namespace

std;

6 typedef long

long

ll;7

int n,m,a[300010],sum[300010

];8 inline int

read()

13while(c<='

9'&&c>='

0') ret=ret*10+c-'

0',c=getchar();

14return ret*op;15}

16int ans,q[300010

],l,r;

17int

main()

23 l=r=1

;24 q[1]=0;25

for(int i=1;i<=n;i++)

31 printf("

%d\n

",ans);

32return0;

33 }

ac code

JoyOI 1305 CH1201最大子序和

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

ContestHunter 1201 最大子序和

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

和最大子串行

問題描述 第一行輸入乙個正整數n 1 n 100001 第二行輸入n個整數a 0 a 10000 求該組整數子串行最大的和。解決這個問題應該考慮輸入n較大的情況,也就是說,輸入100000個數字判斷它的和最大子串行應當也能很快地算出來。我看過很多求解的 有三重for迴圈的,有兩重for迴圈的,也有使...