題目看這裡
若[i,j]符合要求,那麼[i,j]內的任何連續的子段都是符合要求的。我們可以列舉i,找到能合格的最遠的j,然後ans+=(j-i+1)。
那麼問題就轉換成了:在固定i的情況下,如何判斷j範圍內是否合法?若[i,j]內的max-min<=k自然就合法。於是相當於求區間內的最值問題。這個可以用單調佇列解決。
下面對**給出一些解釋:
1:為何是j-i而非j-i+1?因為當不合法時區間相當於[i,j),左閉右開,數量是i-j即可。
2:後面的兩行如if (dqb.front() == i) dqb.pop_front(); 什麼作用?因為要列舉i,所以到了下乙個i的時候,若前面的i還在佇列中,要去掉。
#include usingnamespace
std;
const
int maxn=5e4+5
;int
n, m, k, t;
intg[maxn];
deque
dqb, dqs;
intmain()
ans += (j -i);
if (dqs.front() ==i) dqs.pop_front();
if (dqb.front() ==i) dqb.pop_front();
}printf("%d
", ans);
return0;
}
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,則認為...
51Nod1810 連續區間
區間內所有元素排序後,任意相鄰兩個元素值差為1的區間稱為 連續區間 如 3,1,2是連續區間,但3,1,4不是連續區間 給出乙個1 n的排列,求出有多少個連續區間 input 乙個數n n 1,000,000 第二行n個數,表示乙個1 n的排列 output 乙個數,表示有多少個連續區間 input...