hdu 3530 單調佇列dp

2021-06-16 09:18:07 字數 672 閱讀 3108

這麼乙個破題折騰了我兩天,還能說神馬。。。爛的不能再爛了。。。。

應該說我剛開始想的還是基本正確的,但「基本」是不能容忍的。。。就是記錄兩個單調佇列,乙個單調不遞減,另乙個單調不遞增。記錄從後往前數的最大值和最小值,列舉以i為最後乙個元素的符合題目要求的序列。當兩個隊頭的差大於k時,這說明需要調整,增大最小值或減小最大值,縮短區間。至於我犯得兩個錯誤,在這裡就不說明了。然後就是確定區間長度,**很簡單,所以略掉,附**:

#include #define cl(a) memset(a,0,sizeof(a))

#define ss(a) scanf("%d",&a)

using namespace std;

struct node

;const int n=1000100;

node a[n],b[n],c[n];

int main()

cl(b);cl(c);

l1=0;r1=1;

l2=0;r2=1;

b[0].id=c[0].id=0;

zmax=0;

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

}if (zmax==1&&m>0) zmax=0;

printf("%d\n",zmax);

}return 0;

}

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...

HDU 3530 單調佇列

點選開啟鏈結 題意 給n個數和m,k,問你數列中最長的子串行,其中最大值減去最小值大於等於m小於等於k 思路 想著想著想到尺取去了,寫了一半實現不了 一看單調佇列也沒怎麼練過,大致就只知道單調佇列肯定是維護乙個什麼東西,只能看大神們的思路了,維護了兩個佇列,乙個是以當前結束所構成的遞減序列的位置,另...