• Assignment(单调队列)


    做题时的问题:

    两个单调队列实现会出现一个问题:可用范围因最大最小值队列(存在队头)的更改(出队,导致不可见)而缩小。如果单纯计算队列中覆盖的范围,就会漏掉一些区间。如这组数据:

    1
    10 5
    0 3 4 5 2 1 6 7 8 9 

    当运行到数字“2”处时,单调队列(存下标)变成这样:

    大:4 5

    小:5

    实际上,在2~5范围内的所有区间均有效。

    (以上只是反思本蒟蒻的个人问题,大佬可无视)

        ---------------分割线---------------

    思路:

    需要两个标记:当前有效范围的左端点j(当队头元素差>=k时改变)和右端点i(随循环进行)。【为方便计算,我开成左开右闭的(j,i]】

    当队头元素差>=k时,将j右移一位,并把处于有效范围外的元素从头部出队。操作完后,累加答案。

    for(i=1;i<=n;++i)//带min的与区间最小值有关,max最大值
    {
        while(lmin<=rmin&&a[i]<a[qmin[rmin]]) qmin[rmin--]=0;//删除,方便调试
        qmin[++rmin]=i;
        while(lmax<=rmax&&a[i]>a[qmax[rmax]]) qmax[rmax--]=0;
        qmax[++rmax]=i;
        while(lmin<=rmin&&lmax<=rmax
        &&a[qmax[lmax]]-a[qmin[lmin]]>=k)
        {
            ++j;//更改有效范围
            if (qmax[lmax]==j)
                qmax[lmax++]=0;
            if (qmin[lmin]==j)
                qmin[lmin++]=0;//把无用最大最小值出队
        }
        ans+=i-j;//累加答案
    }

     

  • 相关阅读:
    cf415D Mashmokh and ACM(DP)
    [USACO]EulerianTour (欧拉通路)
    hdu2544 (SPFA)
    hdu2544 (bellman-ford)
    [TC]SRM615 div1 250 AmebaDiv1
    Step By Step (zz from UESTC)
    [USACO]Sweet Butter 多种解法
    Node.js权威指南 (3)
    Web开发常见问题荟萃
    比较vue.js react.js angular.js
  • 原文地址:https://www.cnblogs.com/xzs123456/p/10803206.html
Copyright © 2020-2023  润新知