Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
98236 | CSYZCaoMY | 早凉与序列4 | C++ | 解答错误 | 0 | 67 MS | 7488 KB | 2186 | 2023-08-14 12:58:47 |
#include<bits/stdc++.h> using namespace std; long long a[200005],s[200005],t[800005]; inline void pushup(int now){ t[now]=min(t[now<<1],t[now<<1|1]); } void build(int now,int l,int r){ if(l==r){ t[now]=s[l]; return; } int mid=(l+r)>>1; build(now<<1,l,mid); build(now<<1|1,mid+1,r); pushup(now); } void add(int po,int val,int now,int l,int r){ if(l==r){ t[now]+=val; return; } int mid=(l+r)>>1; if(po<=mid) add(po,val,now<<1,l,mid); else add(po,val,now<<1|1,mid+1,r); pushup(now); } long long query(int l,int r,int now,int nl,int nr){ if(l==nl && r==nr) return t[now]; int mid=(nl+nr)>>1; if(r<=mid) return query(l,r,now<<1,nl,mid); else if(l<=mid) return min(query(l,mid,now<<1,nl,mid),query(mid+1,r,now<<1|1,mid+1,nr)); else return query(l,r,now<<1|1,mid+1,nr); } int main(){ int n,k; long long x,ans=0; scanf("%d%d%lld",&n,&k,&x); for(int i=1;i<=n;i++){ scanf("%lld",&a[i]); s[i]=s[i-1]+a[i]; } if(x<0) x=-x; else if(x>0) k=n-k; if(k==n){ for(int i=1;i<=n;i++) s[i]-=i*x; build(1,0,n); for(int i=1;i<=n;i++){ long long minn=query(0,i-1,1,0,n); // printf("%lld\n",minn); ans=max(ans,s[i]-minn); } printf("%lld",ans); return 0; } build(1,0,n); for(int i=1;i<=n-k;i++){ if(i-1) add(i-1,(i-1)*x,1,0,n); long long minn=query(0,i-1,1,0,n); // printf("%lld\n",minn); ans=max(ans,s[i]-minn+i*x); } for(int i=n-k+1;i<=n;i++){ add(i-n+k-1,-2*(i-1)*x,1,0,n); long long minn=query(0,i-n+k-1,1,0,n); // printf("%lld ",minn); ans=max(ans,s[i]-minn-i*x); add(i-1,(i-1)*x,1,0,n); minn=query(i-n+k,i-1,1,0,n); // printf("%lld\n",minn); ans=max(ans,s[i]-minn+i*x); } printf("%lld",ans); return 0; }/* Samples 1: Input: 4 1 2 2 -1 2 3 Output: 5 Samples 2: Input: 6 2 -8 4 -1 9 -3 7 -8 Output: 44 Samples 3: Input: 3 0 5 3 2 4 Output: 0 */