环上最大连续和
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