題目:
題意:給你乙個長度為n的陣列,要求一段連續的子串行滿足子串行中最大值減去最小值在[m,
k]
[m,k]
[m,k
]範圍內。求該子串行的最大長度。
思路:我們假設區間右邊界為i
ii,然後求下標[1,
i]
[1,i]
[1,i
]中滿足最大值減去最小值在[m,k]範圍內的最小左邊界。我們可以用單調佇列維護乙個當前字首最大值序列和最小值序列。可以用下列步驟描述:
將下標為i
ii的值加入單調佇列。
檢視最大值單調佇列隊首減去最小值單調佇列隊首<=k是否滿足,
在前面出隊的時候記錄下出隊的最大下標即為now,那麼now就是區間不能取的最大位置。
檢視最大值單調佇列隊首減去最小值單調佇列隊首>=m是否滿足,如果滿足用此時最長滿足的區間下標為[no
w+1,
i]
[now+1,i]
[now+1
,i],更新答案。否則對於i
ii不可能有滿足條件的區間左端點,不更新答案,並判斷i+1
**:
#include
#define mset(a,b) memset(a,b,sizeof(a))
using
namespace std;
typedef
long
long ll;
typedef pair<
int,
int> p;
const
int inf=
0x3f3f3f3f
;deque<
int> q1,q2;
int a[
100000+10
];intmain()
else}if
(!q1.
empty()
&&!q2.
empty()
&&a[q1.
front()
]-a[q2.
front()
]>=m)
ans=
max(ans,i-no);}
cout<}}
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 接下來...
hdu3530 Subsequence 單調佇列
題目 在乙個序列中找乙個最長子串,使得子串的m 極差 k.維護乙個遞減的單調佇列q1 隊首為當前最大 同時維護乙個遞增的單調佇列q2 隊首為當前最小 控制最大減最小 小於等於k 若最大減最小大於等於m,則更新答案。include include include include includeusin...
hdu 3530 Subsequence 單調佇列
題目鏈結 題意 給定陣列,求得最長的區間,使得其中最大值與最小值的差值在給定的範圍內 m,k 思路 維護兩個佇列記錄元素下標,lo 與 hi 具體如何維護之後再講 保證 a lo 單調增,且記當前處理到下標 i 的位置,則 a lo x 即為 lo x 1 1 i 區間中的最小值 保證 a hi 單...