提交时间:2023-08-14 14:42:41
运行 ID: 98302
#include "bits/stdc++.h" #define ll long long using namespace std; ll n,k,x,a[2000000],s[2000000],f[2000000],l,ans,b[2000000]; int i,j; struct node{ ll v,i; }q[2000000]; void push(ll x,ll i) { while(l>0&&x>=q[l].v) l--; q[++l].v=x,q[l].i=i; } int main() { cin>>n>>k>>x; for(i=1;i<=n;i++) cin>>a[i],b[i]=a[i]; if(x<0) x=-x,k=n-k; if(k!=0) { for(i=1;i<=n-k+1;i++) { l=0; q[1].v=0; for(j=1;j<i;j++) b[j]=a[j]-x; for(j=i;j<=i+k-1;j++) b[j]=a[j]+x; for(j=i+k;j<=n;j++) b[j]=a[j]-x; for(j=1;j<=n;j++) s[j]=s[j-1]+b[j]; for(j=1;j<=n;j++) { f[j]=max( (ll) 0,q[1].v+s[j]); push(f[j]-s[j],j); } for(j=1;j<=n;j++) ans=max(ans,f[j]); } cout<<max((ll)0,ans); } else { for(i=1;i<=n;i++) a[i]-=x; for(i=1;i<=n;i++) s[i]=s[i-1]+a[i]; for(i=1;i<=n;i++) { f[i]=max((ll)0,q[1].v+s[i]); push(f[i]-s[i],i); } for(j=1;j<=n;j++) ans=max(ans,f[j]); cout<<ans; } }