美文网首页【打基础】算法集
邓俊辉算法训练营 -- 序列计数

邓俊辉算法训练营 -- 序列计数

作者: 拜仁的月饼 | 来源:发表于2019-05-22 13:14 被阅读0次

    描述

    给定一个n个整数的序列以及一个非负整数d,请你输出这个序列中有多少个连续子序列(长度大于1),满足该子序列的最大值最小值之差不大于d。

    连续子序列:序列1 2 3中长度大于1的连续子序列有:

    1 2
    2 3
    1 2 3
    

    输入

    第一行包含两个整数n,d。

    接下来一行包含n个整数。

    输出

    输出一个整数,表示满足条件的连续子序列个数。

    样例1输入

    8 5
    5 5 4 8 -10 10 0 1
    
    

    样例1输出

    7
    
    

    样例1解释

    满足条件的连续子序列有:

    5 5
    5 5 4
    5 5 4 8
    5 4
    5 4 8
    4 8
    0 1
    
    

    样例2

    请查看下发文件内的sample2_input.txt和sample2_output.txt。

    限制

    对于60%的数据,n ≤ 5000;

    对于100%的数据,n ≤ 300000。

    保证所有整数的绝对值不超过109,d不超过2×109。

    时间:10 sec

    空间:512 MB

    提示

    • 考虑分治。
    • 令函数solve(l, r)表示统计[l, r]中合法的连续子序列个数,mid为(l+r)/2(下取整)。
    • 那么当l = r时,solve(l, r) = 0,
    • l!=r时, solve(l, r) = solve(l, mid) + solve(mid + 1, r) + cal(l, r, mid)
    • 其中cal(l, r, mid)表示在左端点在区间[l, mid]中、右端点在区间[mid + 1, r]中的符合要求的连续子序列数目,那么答案就是solve(1, n)。
    • 至于cal(l, r, mid)怎么算,大家可以仔细思考思考。(右端点是有单调性的)
    • 注意答案要用long long
    • 另外这题也可以用线性的方法做哦~有兴趣去搜一搜单调栈

    题解(Python实现)

    
    

    相关文章

      网友评论

        本文标题:邓俊辉算法训练营 -- 序列计数

        本文链接:https://www.haomeiwen.com/subject/xvwyzqtx.html