提交时间:2023-08-14 12:24:51

运行 ID: 98174

#include<bits/stdc++.h> #define ll long long using namespace std; ll read(){ ll x;char c;bool f=false; while((c=getchar())<'0'||c>'9')if(c=='-')f=true; x=c-48; while((c=getchar())>='0'&&c<='9')x=x*10-48+c; if(f)x=-x; return x; } void write(ll x){ if(x>9)write(x/10); putchar(x%10+48); } const int maxn=200020; ll a[maxn]; ll num[maxn<<2],tag[maxn<<2]; void init(int p,int l,int r){ num[p]=0; if(l==r){tag[p]=a[l];return;} int mid=(l+r)/2; init(2*p,l,mid); init(2*p+1,mid+1,r); tag[p]=max(tag[2*p],tag[2*p+1]); } void add(int p,int l,int r,int L,int R,int x){ if(L<=l&&r<=R){tag[p]+=x;num[p]+=x;return;} int mid=(l+r)/2; if(L<=mid)add(2*p,l,mid,L,R,x); if(mid<R)add(2*p+1,mid+1,r,L,R,x); tag[p]=max(tag[2*p],tag[2*p+1])+num[p]; } ll ask(int p,int l,int r,int L,int R){ if(L<=l&&r<=R)return tag[p]; int mid=(l+r)/2; if(R<=mid)return ask(2*p,l,mid,L,R)+num[p]; if(mid<L)return ask(2*p+1,mid+1,r,L,R)+num[p]; return max(ask(2*p,l,mid,L,R),ask(2*p+1,mid+1,r,L,R))+num[p]; } int main(){ int n=read(),k=read(),x=read();ll ans=0; if(x<0)x=-x,k=n-k; a[0]=0; for(int i=1;i<=n;i++) a[i]=read()+(i<=k?x:-x)+a[i-1]; init(1,1,n); for(int i=1;i<=n;i++){ ans=max(ans,ask(1,1,n,i,n)-(i==1?0:ask(1,1,n,i-1,i-1))); if(k!=0)add(1,1,n,i,min(n,i+k-1),-2*x); } printf("%lld\n",ans); return 0; }