Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
98190 | CSYZ_LiWenX | 早凉与序列4 | C++ | 通过 | 100 | 109 MS | 13648 KB | 1644 | 2023-08-14 12:26:58 |
#include<bits/stdc++.h> #define int long long using namespace std; int n,k,x; int a[200001],sum[200001]; int tree[200001<<2],tag[200001<<2]; #define ls (now<<1) #define rs (now<<1|1) #define mid ((l+r)>>1) void build(int now,int l,int r){ if(l==r){ tree[now]=-1e18; return ; } build(ls,l,mid); build(rs,mid+1,r); } void pushdown(int now){ if(tag[now]){ tree[ls]+=tag[now]; tree[rs]+=tag[now]; tag[ls]+=tag[now]; tag[rs]+=tag[now]; tag[now]=0; } } void addp(int now,int l,int r,int x,int k){ if(l==r){ tree[now]=k; return ; } pushdown(now); if(mid>=x) addp(ls,l,mid,x,k); else addp(rs,mid+1,r,x,k); tree[now]=max(tree[ls],tree[rs]); } void add(int now,int l,int r,int x,int y,int k){ if(l>=x&&r<=y){ tree[now]+=k; tag[now]+=k; return ; } pushdown(now); if(mid>=x) add(ls,l,mid,x,y,k); if(mid<y) add(rs,mid+1,r,x,y,k); tree[now]=max(tree[ls],tree[rs]); } signed main(){ // freopen("_.in","r",stdin); ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n>>k>>x; if(x<0){ x=-x,k=n-k; } for(int i=1;i<=n;i++){ cin>>a[i]; a[i]-=x; sum[i]=sum[i-1]+a[i]; } // for(int i=0;i<=n;i++) cout<<sum[i]<<' '; // cout<<'\n'; build(1,1,n); int ans=0; for(int i=1;i<=n;i++){ addp(1,1,n,i,-sum[i-1]); if(i-k+1>=1) add(1,1,n,i-k+1,i,2*x); else add(1,1,n,1,i,2*x); ans=max(ans,sum[i]+tree[1]); // for(int j=1;j<=i;j++){ // if(j<=i-k){ // ans=max(ans,sum[i]-sum[j-1]+2*x*k); // } // else{ // ans=max(ans,sum[i]-sum[j-1]+2*x*(i-j+1)); // } // } } cout<<ans; } /* 10 7 -9 5 4 8 9 7 -5 -6 0 1 10 */