一道關於單調佇列的模板題。
題目要求求一段區間,使得這一段區間的和最大且區間長度不超過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 5ac codeusing
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 }
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迴圈的,也有使...