hdu 3530 dp 單調佇列優化

2021-06-09 13:13:26 字數 614 閱讀 2343

題目:

題意:給你乙個長度為n的數列,要求乙個子區間,使得區間的最大值與最小值的差s滿足,

m<=s<=k,求滿足條件的最長子區間

分析:做了前面幾題後,這題容易想到用兩個單調佇列維護當前最值,

作為判斷條件,如果差值大於k了,就去掉較前面的那個佇列元素,並把區間頭更新為它的標號+1,

這裡注意差值小於m並不需要去掉元素,還有更新答案時要先判斷是否滿足條件才能更新,

/**/

#include#include#include#includeusing namespace std;

const int maxn=100002;

int qmin[maxn],qmax[maxn],n,m,k,a[maxn];

int main()

}printf("%d\n",ans);

}return 0;}/*

5 0 0

1 1 1 1 1

5 0 3

1 2 3 4 5

8 0 3

1 2 3 4 6 5 5 5

10 0 3

1 5 8 7 2 2 2 3 5 2

*/

hdu 3530 單調佇列dp

這麼乙個破題折騰了我兩天,還能說神馬。爛的不能再爛了。應該說我剛開始想的還是基本正確的,但 基本 是不能容忍的。就是記錄兩個單調佇列,乙個單調不遞減,另乙個單調不遞增。記錄從後往前數的最大值和最小值,列舉以i為最後乙個元素的符合題目要求的序列。當兩個隊頭的差大於k時,這說明需要調整,增大最小值或減小...

hdu 3530 單調佇列

單調佇列就是佇列中的元素是單調遞增或遞減的。比如把 5 2 3 1 4 入隊 減 增 5 5 5 2 2 5 3 2 3 5 3 1 1 5 4 1 4 這個還是好理解的,但是,我們得會用單調佇列這一特性去解決題目,抽象出題目中有類似的操作。subsequence 題意 給三個數 n,x,y 接下來...

hdu 3530(單調佇列)

傳送門 題解 用乙個單調不公升的佇列維護最大值,乙個單調不減的佇列維護最小值。如果不滿足條件,後移答案區間左端點,取兩個佇列頭指標的元素較小的乙個 位置盡量靠前使區間盡量長 include include include include using namespace std const int m...