114514xxx @ 2024-10-09 16:03:18
#include<bits/stdc++.h>
#define ls 2*p
#define rs 2*p+1
using namespace std;
const int N=4e5+25;
int f[N],a[N];
int n,l,r;
struct SegmentTree{
int l,r,maxn;
}t[N*4];
inline void build(int l,int r,int p){
t[p].l=l,t[p].r=r;
if(l==r){
t[p].maxn=f[l];
return;
}
int mid=(l+r)/2;
build(l,mid,ls);
build(mid+1,r,rs);
t[p].maxn=max(t[ls].maxn,t[rs].maxn);
}
inline void modify(int l,int r,int p,int k){
if(t[p].l==t[p].r&&t[p].l==l){
t[p].maxn=k;
return;
}
int mid=(t[p].l+t[p].r)/2;
if(l<=mid)modify(l,r,ls,k);
if(r>mid)modify(l,r,rs,k);
t[p].maxn=max(t[ls].maxn,t[rs].maxn);
}
inline int query(int l,int r,int p){
int res=INT_MIN;
if(t[p].l>=l&&t[p].r<=r)return t[p].maxn;
int mid=(t[p].l+t[p].r)/2;
if(l<=mid)res=max(res,query(l,r,ls));
if(r>mid)res=max(res,query(l,r,rs));
t[p].maxn=max(t[ls].maxn,t[rs].maxn);
return res;
}
int main(){
cin>>n>>l>>r;
for(int i=0;i<=n;i++)
cin>>a[i];
build(0,n*2,1);
int ans=INT_MIN;
for(int i=l;i<=r;i++){
f[i]=max(query(0,i-l,1)+a[i],f[i]);
modify(i,i,1,f[i]);
}
for(int i=r+1;i<=n+r;++i){
f[i]=max(f[i],query(i-r,i-l,1)+a[i]);
modify(i,i,1,f[i]);
}
for(int i=1;i<=n;i++)
ans=max(ans,f[i]);
cout<<ans;
}
by zichen3004 @ 2024-10-09 16:36:01
感觉 modify 在瞎写,为什么最后变成了单点修改,而且区间修改没写 lazytag 还没 TLE 证明数据有点水。