給出乙個有n個數的序列,求出有多少個子段滿足子段內最大值與最小值的差小於等於k
單調佇列做
j表示往右最長能覆蓋到的那個數,用兩個單調佇列來維護j的範圍,乙個遞增,乙個遞減
然後對於每個i,j的取值都可能不同,但是隨著i增大,j不可能減小,所以每次維護完j,答案增加以i為左端點的貢獻
這樣做是o(n)的,因為j最大為n
然後每次i結束前,將佇列中位置<=i的刪掉,因為對於i+1及後面的數而言,i不能對它們造成影響
#include#include#include
#include
#include
using
namespace
std;
typedef
long
long
ll;int a[51000
];int q1[51000],q2[51000
];int
main()
ans+=j-i;
while(l1<=r1&&q1[l1]<=i) l1++;
while(l2<=r2&&q2[l2]<=i) l2++;
}printf(
"%d\n
",ans);
return0;
}
51nod 1275 連續子段的差異
題目看這裡 若 i,j 符合要求,那麼 i,j 內的任何連續的子段都是符合要求的。我們可以列舉i,找到能合格的最遠的j,然後ans j i 1 那麼問題就轉換成了 在固定i的情況下,如何判斷j範圍內是否合法?若 i,j 內的max min k自然就合法。於是相當於求區間內的最值問題。這個可以用單調佇...
51nod 1275 連續子段的差異 單調佇列
原題鏈結 1275 連續子段的差異 codility 基準時間限制 1 秒 空間限制 131072 kb 分值 80 難度 5級演算法題 給出乙個包括n個元素的整數陣列a,包括a本身在內,共有 n 1 n 2個非空子段。例如 1 3 2的子段為 在這些子段中,如果最大值同最小值的差異不超過k,則認為...
51Nod1810 連續區間
區間內所有元素排序後,任意相鄰兩個元素值差為1的區間稱為 連續區間 如 3,1,2是連續區間,但3,1,4不是連續區間 給出乙個1 n的排列,求出有多少個連續區間 input 乙個數n n 1,000,000 第二行n個數,表示乙個1 n的排列 output 乙個數,表示有多少個連續區間 input...