51Nod 1275 雙指標 雙端佇列

2021-08-21 09:28:23 字數 1017 閱讀 8314

題目鏈結

題意:給定乙個陣列a

aa和乙個整數k

kk,問有多少個連續區間的最大值和最小值的差不大於kkk

思路:首先對於固定起點的連續區間,隨著終點的增大,其區間最大值一定非遞減,區間最小值一定非遞增,故區間最大值和最小值的差一定是非遞減的。

故可以利用雙指標來快速求出合法區間的個數。

但該過程還需要快速求出區間最小值和最大值,故使用雙端佇列來實現滑動視窗。

保持佇列的單調性,同時維護隊首元素始終有效。

此題得解。

**:

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

#define lson rt<<1

#define rson rt<<1|1

const

int inf =

1e9+7;

const

int a =

1e5+10;

int n,k,a[a]

;int que_mx[a]

, que_mn[a]

;int ln,rn,lx,rx;

intmain()

int st =

1,ed =1;

ln = rn = lx = rx =0;

ll ans =0;

while

(st<=n)

ans +

=1ll

*(ed - st);if

(que_mx[lx+1]

== st) lx++;if

(que_mn[ln+1]

== st) ln++

; st++;}

printf

("%i64d\n"

,ans)

;return0;

}

51nod 1275 連續子段的差異

題目看這裡 若 i,j 符合要求,那麼 i,j 內的任何連續的子段都是符合要求的。我們可以列舉i,找到能合格的最遠的j,然後ans j i 1 那麼問題就轉換成了 在固定i的情況下,如何判斷j範圍內是否合法?若 i,j 內的max min k自然就合法。於是相當於求區間內的最值問題。這個可以用單調佇...

51nod 1275 連續子段的差異

給出乙個有n個數的序列,求出有多少個子段滿足子段內最大值與最小值的差小於等於k 單調佇列做 j表示往右最長能覆蓋到的那個數,用兩個單調佇列來維護j的範圍,乙個遞增,乙個遞減 然後對於每個i,j的取值都可能不同,但是隨著i增大,j不可能減小,所以每次維護完j,答案增加以i為左端點的貢獻 這樣做是o n...

51nod 1275 連續子段的差異 單調佇列

原題鏈結 1275 連續子段的差異 codility 基準時間限制 1 秒 空間限制 131072 kb 分值 80 難度 5級演算法題 給出乙個包括n個元素的整數陣列a,包括a本身在內,共有 n 1 n 2個非空子段。例如 1 3 2的子段為 在這些子段中,如果最大值同最小值的差異不超過k,則認為...