hdu3415 最大k子段和,單調佇列

2022-05-23 18:36:05 字數 1170 閱讀 7307

題目大意:

給定長度為n的陣列,求出最大的區間和,其中區間長度在[1,k]之間

分析:學動態規劃的時候我們會遇到乙個經典問題

最大子段和,這個題跟最大子段和很類似 不同的是區間的長度有限制,無法用原演算法解決

轉換思路

區間[i,j]的和就是ans=sum(j)-sum(i-1) ( j - i <=k)

那麼對於每個j 我們肯定希望sum(i-1)最小,所以我們只需要對sum(i-1)維護乙個單調佇列,然後依次增加 j

同時將單調佇列中不滿足( j - i **:

#include #include 

#include

#include

#include

#include

using

namespace

std;

#define maxn 10000010typedef

struct

node

node;

typedef

struct

dqueue

node front()

node pop()

void

push(node x)

if(x.valwhile(r>=1&&(x.val1

].val))

q[r++]=x;

}}dqueue;

int a[200020

];int sum[200020

];dqueue q;

intmain()

memcpy(a+n+1,a+1,n*sizeof(int

));

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

node x;

node tmp;

int t=0

; q.ini();

int ans=-10000

;

intl,r;

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

else

}if(sum[i]-tmp.val>ans)

}if(r>n)

printf(

"%d %d %d\n

",ans,l,r);

}return0;

}

HDU3415單調佇列

這題是單調佇列的典型運用。至於單調佇列,就是乙個雙端佇列,在隊首 f 出隊,在隊尾 b 出隊入隊,我們要維護整個佇列的元素是單調的,比如,我們要動態查詢從左向右的區間的最小值,那麼我們就要在佇列中維護乙個單調遞增的序列,從左向右列舉,佇列的元素還有乙個id值,代表這個元素在原序列中的位置,然後左邊的...

HDU 3415單調佇列

這個題目屬於常見題型,給定一組環狀數列,求出其中長度不超過k的數字之和的最大值。用到了字首和的技巧,比如要求i,j間所有數字之和,可以提前在輸入的時候計算出從0 i的數字之和及從0 j的數字之和,那麼sum i j sum j sum i 現在的問題是求出最大的sum i j 那麼我們可以固定sum...

HDU3415單調佇列

這題是單調佇列的典型運用。至於單調佇列,就是乙個雙端佇列,在隊首 f 出隊,在隊尾 b 出隊入隊,我們要維護整個佇列的元素是單調的,比如,我們要動態查詢從左向右的區間的最小值,那麼我們就要在佇列中維護乙個單調遞增的序列,從左向右列舉,佇列的元素還有乙個id值,代表這個元素在原序列中的位置,然後左邊的...