环上最大连续和

Posted applechina

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了环上最大连续和相关的知识,希望对你有一定的参考价值。

给定N,K以及一个环:A[1],A[2],A[3],...A[N],其中A[1]的左边是A[N]。
求该环上最大的连续子段和,要求选出的子段长度不超过K。

输入描述:
第一行两个整数N和K。
接下来一行,N个整数表示A[i]。



输出描述:
输出题目要求的最大连续和。






求Max{sum[i]-sum[x]},
单调队列
维护sum[x]。

code
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<algorithm>
using namespace std;
inline void read(int &a)
{
    int k=1; a=0; char c=getchar();
    while(c<0||9<c){if(c==-)k=-1; c=getchar();}
    while(0<=c&&c<=9){a=a*10+c-0; c=getchar();}
    a*=k;
}
inline void write(int a)
{
    if (a<0){putchar(-);a=-a;}
    if (a>9)write(a/10);
    putchar(a%10+0);
    return ;
}
int a[200005],q[200005],sum[200005];
int main()
{
    int n,m,i,j;
    cin>>n>>m;
    for (i=1;i<=n;i++)
    {
        read(a[i]);
        a[i+n]=a[i];
    } 
    for (i=1;i<=2*n;i++)
    {
        sum[i]=sum[i-1]+a[i];
    }
    int l=1,r=1,ans=-2147483647;
    q[r]=0;
    for (i=1;i<=n+m;i++)
    {
        while (l<=r&&i-q[l]>m)
        l++;
        if (l<=r&&sum[i]-sum[q[l]]>=ans)
        {
            ans=sum[i]-sum[q[l]];
        }
        while (l<=r&&sum[q[r]]>=sum[i])
        r--;
        q[++r]=i;
    } 
    cout<<ans<<endl;
    return 0;
}

 

 

以上是关于环上最大连续和的主要内容,如果未能解决你的问题,请参考以下文章

《剑指Offer——连续子数组的最大和,礼物的最大价值》代码

bzoj1124[POI2008]枪战maf tarjan+树规+贪心/线性DP

写写代码系列013:剑指offer题目——连续子数组的最大和(动态规划)

P4381 [IOI2008]Island

算法小总结最大连续子序列和最大连续子矩阵的关系与实现

求连续序列的最大子序列和