panrui_SCZ @ 2024-11-25 15:51:57
rt hack 数据通过,原始数据全WA
#include<bits/stdc++.h>
using namespace std;
struct tree{
int l,r,v;
}t[1145141];
void build(int l,int r,int p){
t[p].l=l,t[p].r=r;
if(l==r) return;
int mid=(l+r)>>1;
build(l,mid,p*2);
build(mid+1,r,p*2+1);
}
void update(int l,int x,int p){
if(t[p].l==t[p].r){
t[p].v=x;
return;
}
int mid=(t[p].l+t[p].r)>>1;
if(l<=mid) update(l,x,p*2);
else update(l,x,p*2+1);
t[p].v=t[p*2].v+t[p*2+1].v;
}
int query(int l,int r,int p){
if(t[p].l>=l&&t[p].r<=r) return t[p].v;
int mid=(t[p].l+t[p].r)>>1;
int ans=-11451419;
if(l<=mid) ans=max(ans,query(l,r,p*2));
if(r>mid) ans=max(ans,query(l,r,p*2+1));
return ans;
}
int a[200005],f[200005];
int main(){
int n,l,r;
scanf("%d%d%d",&n,&l,&r);
build(1,n,1);
cin>>a[0];
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
memset(f,-0x3f,sizeof(f));
f[0]=0;
for(int i=1;i<=r;i++){
if(i==l)
f[i]=a[i];
if(i>l)
f[i]=query(1,i-l,1)+a[i];
if(f[i]==f[200004]+a[i]) f[i]=f[200004];
update(i,f[i],1);
}
for(int i=r+1;i<=n;i++){
f[i]=query(i-r,i-l,1)+a[i];
if(f[i]==f[200004]+a[i]) f[i]=f[200004];
update(i,f[i],1);
}
int ans=-11451419;
for(int i=n-r+1;i<=n;i++)
ans=max(ans,f[i]);
cout<<ans<<endl;
return 0;
}
by hepp @ 2024-11-25 16:06:52
@panrui_SCZ 更新错了吧,应该是求max不是和
by panrui_SCZ @ 2024-11-25 18:08:01
@hepp ok,谢谢