Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
98174 | CSYZ_using | 早凉与序列4 | C++ | 通过 | 100 | 101 MS | 10012 KB | 1480 | 2023-08-14 12:24:51 |
#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; }