求调,线段树WA100,悬一关

P1725 琪露诺

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 证明数据有点水。


|