原題鏈結
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)output第2 - n + 1行:每行1個數,對應陣列的元素ai(0 <= a[i] <= 10^9)
輸出符合條件的子段數量。input示例
5 235762output示例
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...