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

2021-07-22 13:58:09 字數 967 閱讀 2168

原題鏈結

1275 連續子段的差異

codility

基準時間限制:1 秒 空間限制:131072 kb 分值: 80 

難度:5級演算法題

給出乙個包括n個元素的整數陣列a,包括a本身在內,共有 (n+1)*n / 2個非空子段。例如:1 3 2的子段為 。在這些子段中,如果最大值同最小值的差異不超過k,則認為這是乙個合格的子段。給出陣列a和k,求有多少符合條件的子段。例如:3 5 7 6 3,k = 2,符合條件的子段包括: ,共9個。

input

第1行:2個數n, k(1 <= n <= 50000, 0 <= k <= 10^9)

第2 - n + 1行:每行1個數,對應陣列的元素ai(0 <= a[i] <= 10^9)

output

輸出符合條件的子段數量。
input示例

5 235762

output示例

9

#include #include #include #include #define maxn 50005

using namespace std;

typedef long long ll;

int deq1[maxn], deq2[maxn];

int num[maxn];

ll f(int n)

int main()

else if(deq1[l1] < deq2[l2])

}int h1, h2;

if(sign == 0)

else

d = f(h2 - h1 - 1);

} }ans += f(n - pre) - d;

printf("%i64d\n", ans);

return 0;

}

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...

51Nod1810 連續區間

區間內所有元素排序後,任意相鄰兩個元素值差為1的區間稱為 連續區間 如 3,1,2是連續區間,但3,1,4不是連續區間 給出乙個1 n的排列,求出有多少個連續區間 input 乙個數n n 1,000,000 第二行n個數,表示乙個1 n的排列 output 乙個數,表示有多少個連續區間 input...