51nod 1275 連續子段的差異

2022-05-19 19:38:20 字數 658 閱讀 6118

給出乙個有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...