• BZOJ4385[POI2015]Wilcze doły——单调队列+双指针


    题目描述

    给定一个长度为n的序列,你有一次机会选中一段连续的长度不超过d的区间,将里面所有数字全部修改为0。
    请找到最长的一段连续区间,使得该区间内所有数字之和不超过p。

    输入

    第一行包含三个整数n,p,d(1<=d<=n<=2000000,0<=p<=10^16)。
    第二行包含n个正整数,依次表示序列中每个数w[i](1<=w[i]<=10^9)。

    输出

    包含一行一个正整数,即修改后能找到的最长的符合条件的区间的长度。

    样例输入

    9 7 2
    3 4 1 9 4 1 7 1 3

    样例输出

    5

    提示

    将第4个和第5个数修改为0,然后可以选出区间[2,6],总和为4+1+0+0+1=6。

    首先想一下暴力,枚举修改区间及选择区间更新答案。

    优化一下,发现对于固定修改区间,选择区间具有单调性,因此可以单调队列维护。

    再进一步想一想能发现修改区间也具有单调性,如果前面的修改区间比后面修改区间的区间和小,那么前面那个区间就没用了。

    所以单调队列维护修改区间,双指针扫一下选择区间即可。

    #include<set>
    #include<map>
    #include<cmath>
    #include<queue>
    #include<stack>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int n,d,x;
    int l,r,k;
    int ans;
    long long p;
    long long s[2000010];
    long long f[2000010];
    int q[2000010];
    int main()
    {
        //freopen("magic.in","r",stdin);
        //freopen("magic.out","w",stdout);
        scanf("%d%lld%d",&n,&p,&d);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&x);
            s[i]=s[i-1]+x;
        }   
        for(int i=1;i+d-1<=n;i++)
        {
            f[i]=s[i+d-1]-s[i-1];
        }
        l=1;
        r=1;
        k=1;
        for(int i=d;i<=n;i++)
        {
            while(l<=r&&f[i-d+1]>=f[q[r]])
            {
                r--;
            }
            q[++r]=i-d+1;
            while(s[i]-s[k-1]-f[q[l]]>p)
            {
                k++;
                while(l<r&&q[l]<k)
                {
                    l++;
                }
            }
            if(q[l]>=k)
            {
                ans=max(ans,i-k+1);
            }
        }
        printf("%d",ans);
    }
  • 相关阅读:
    暑假集训D17总结
    [NOI2014]魔法森林
    暑假集训D16总结
    [繁华模拟赛]Evensgn 剪树枝
    暑假集训D15总结
    Openjudge-计算概论(A)-数组顺序逆放
    Openjudge-计算概论(A)-整数的个数
    Openjudge-计算概论(A)-1的个数
    Openjudge-计算概论(A)-求一元二次方程的根
    Openjudge-计算概论(A)-与7无关的数
  • 原文地址:https://www.cnblogs.com/Khada-Jhin/p/9681723.html
Copyright © 2020-2023  润新知