單調佇列就是佇列中的元素是單調遞增或遞減的。比如把 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;
接下來n個數num[1~n];
求滿足這個條件的最長區間長度:
區間內最大值與最小值之差在 x~y之間。
方法:單調佇列記錄下標。
由乙個遞增,乙個遞減的單調佇列,可得前面的某個位置~當前位置的最大差值def=num[q1.front()]-num[q2.front()];
如果def>y,則讓下標靠前的那個出佇列。
上**,看注釋:
#include #include #include using namespace std;
inline int fmax(int a,int b)
int main()
else if(q1.front()q2.front())
}if(!q1.empty() && !q1.empty() && num[q1.front()]-num[q2.front()]>=x)
max=fmax(max,i-last);//若當前區間的def滿足》=x,取區間最大長度
}printf("%d\n",max);
}return 0;
}
hdu 3530(單調佇列)
傳送門 題解 用乙個單調不公升的佇列維護最大值,乙個單調不減的佇列維護最小值。如果不滿足條件,後移答案區間左端點,取兩個佇列頭指標的元素較小的乙個 位置盡量靠前使區間盡量長 include include include include using namespace std const int m...
HDU 3530 單調佇列
點選開啟鏈結 題意 給n個數和m,k,問你數列中最長的子串行,其中最大值減去最小值大於等於m小於等於k 思路 想著想著想到尺取去了,寫了一半實現不了 一看單調佇列也沒怎麼練過,大致就只知道單調佇列肯定是維護乙個什麼東西,只能看大神們的思路了,維護了兩個佇列,乙個是以當前結束所構成的遞減序列的位置,另...
hdu 3530 單調佇列dp
這麼乙個破題折騰了我兩天,還能說神馬。爛的不能再爛了。應該說我剛開始想的還是基本正確的,但 基本 是不能容忍的。就是記錄兩個單調佇列,乙個單調不遞減,另乙個單調不遞增。記錄從後往前數的最大值和最小值,列舉以i為最後乙個元素的符合題目要求的序列。當兩個隊頭的差大於k時,這說明需要調整,增大最小值或減小...