zoukankan      html  css  js  c++  java
  • 有限制的最大连续和问题

    题目大意
    给你一个n,k及一个长度为n的序列.
    求长度小于等于k的最大连续和.
    n<=10^6.

    /*
    n^2的暴力肯定是不行的orz.
    单调队列维护长度不超过k的最大连续字段和.
    前缀和优化.
    复杂度接近线性.
    sum[i]表示到i[1,i]的区间总代价.
    然后我们要求的就是sum[i]-sum[i-j+1] (j<=k)的max.
    所以就是求sum[i-j+1](j<=k)的min.
    用单调队列维护就可以了. 
    */
    #include<iostream>
    #include<cstdio>
    #define MAXN 1000001
    #define LL long long
    using namespace std;
    LL sum[MAXN],n,k,l,x,ans=-1e18,head,tail,q[MAXN];
    LL read(){
        LL x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
        return x*f;
    }
    int main()
    {
        n=read();
        for(int i=1;i<=n;i++) sum[i]=read(),sum[i]+=sum[i-1];
        k=read();
        for(int i=1;i<=n;i++)
        {
            while(head<tail&&sum[i-1]<sum[q[tail-1]])
                tail--;
            q[tail++]=i-1;
            while(head<tail&&i-q[head]>k)
                head++;
            ans=max(ans,sum[i]-sum[q[head]]);
        }
        printf("%lld",ans);
        return 0;
    }
  • 相关阅读:
    vim tab 和4个空格
    python 入门
    pyenv 以及 virtualenv
    Redis Cluster 理论知识
    使用Redis SETNX 命令实现分布式锁
    go runtime scheduler
    LeetCode Valid Parentheses
    LeetCode Rotate Image
    leetcode
    HDU 3657 Game(取数 最小割)经典
  • 原文地址:https://www.cnblogs.com/nancheng58/p/6070764.html
Copyright © 2011-2022 走看看