码迷,mamicode.com
首页 > 其他好文 > 详细

【单调队列】最长区间最大值减最小值小于一个值

时间:2015-08-04 13:07:03      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:

技术分享
void solve()
{
    int ans=0,i,j,front1,front2,rear1,rear2;
    front1=rear1=0;
    front2=rear2=0;

    for(i=1,j=1;j<=n;j++)
    {
        while(rear1>front1&&d[qmax[rear1-1]]<=d[j]) rear1--;
        qmax[rear1++]=j;

        while(rear2>front2&&d[qmin[rear2-1]]>=d[j]) rear2--;
        qmin[rear2++]=j;

        if(d[qmax[front1]]-d[qmin[front2]]>m)
        {
            ans=max(ans,j-i);
            while(d[qmax[front1]]-d[qmin[front2]]>m)
            {
                i=min(qmax[front1],qmin[front2])+1;
                while(rear1>front1&&qmax[front1]<i) front1++;
                while(rear2>front2&&qmin[front2]<i) front2++;
            }
        }
    }
    ans=max(ans,j-i);
    printf("%d\n",ans);
}
int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 0; i < n; ++i) scanf("%d", &d[i]);
    solve();
    return 0;
}
View Code

 

【单调队列】最长区间最大值减最小值小于一个值

标签:

原文地址:http://www.cnblogs.com/Rojo/p/4701621.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!