#include<stdio.h> #include<iostream> using namespace std; const int MAX_N = 100002; int p[MAX_N]; int s[MAX_N]; int N,L; void init() { int i; scanf("%d %d",&N,&L); for (i=1;i<=N;i++) scanf("%d",&p[i]); } int work(int l,int r) { if (l>r) return 0; if (l==r) return p[l]; int mid=(l+r)/2; int tmp=max(work(l,mid),work(mid+1,r)); int i,tmpa; tmpa=p[mid]; s[mid]=max(0,tmpa); for (i=mid-1;i>=l;i--) tmpa+=p[i],s[i]=max(s[i+1],tmpa); tmpa=p[mid+1]; s[mid+1]=max(0,tmpa); for (i=mid+2;i<=r;i++) tmpa+=p[i],s[i]=max(s[i-1],tmpa); if (r-l<=L) return max(tmp,s[l]+s[r]); if (mid-l+1<=L) tmp=max(tmp,s[l]+s[mid+(L-(mid-l+1))]); if (r-mid<=L) tmp=max(tmp,s[r]+s[mid+1-(L-(r-mid))]); for (i=1;i<L;i++) if (mid-i+1<l||mid+L-i>r) break; else tmp=max(tmp,(mid-i+1>=l?s[mid-i+1]:s[l])+(mid+L-i<=r?s[mid+L-i]:s[r])); return tmp; } int main() { freopen("maxsum.in","r",stdin); freopen("maxsum.out","w",stdout); init(); printf("%d",work(1,N)); return 0; }
maxsum by Ye
最新推荐文章于 2024-04-28 01:30:40 发布