线段树解法 0pts 求调

P1725 琪露诺

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,谢谢


|