
1 #include<queue> 2 #include<cmath> 3 #include<cstdio> 4 #include<cstring> 5 #include<iostream> 6 #include<algorithm> 7 using namespace std; 8 long long f[250010]; 9 long long s[250010]; 10 int v[250010]; 11 int n,m; 12 int q[250010]; 13 int l,r; 14 int main() 15 { 16 scanf("%d%d",&n,&m); 17 for(int i=1;i<=n;i++) 18 { 19 scanf("%d",&v[i]); 20 if(v[i]>0) 21 { 22 s[i]=s[i-1]+v[i]; 23 } 24 else 25 { 26 s[i]=s[i-1]; 27 } 28 f[i]=-1ll<<60; 29 } 30 f[0]=0; 31 l=r=1; 32 for(int i=2;i<=n;i++) 33 { 34 while(l<=r&&q[l]<i-m) 35 { 36 l++; 37 } 38 f[i]=f[q[l]]+s[i-2]+v[i-1]+v[i]-s[q[l]]; 39 while(l<=r&&f[q[r]]-s[q[r]]<f[i-1]-s[i-1]) 40 { 41 r--; 42 } 43 q[++r]=i-1; 44 } 45 long long ans=s[m]; 46 for(int i=1;i<=n;i++) 47 { 48 if(i+m-1<=n) 49 { 50 ans=max(ans,f[i]+s[i+m-1]-s[i]); 51 } 52 else 53 { 54 ans=max(ans,f[i]+s[n]-s[i]); 55 } 56 } 57 printf("%lld",ans); 58 }
BZOJ1915[USACO 2010 Open Gold 1.Cow Hopscotch]——DP+斜率优化
原文:https://www.cnblogs.com/Khada-Jhin/p/9157529.html