題目鏈結
題意:給定乙個陣列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,則認為...