线段树动态开点的疑问
查看原帖
线段树动态开点的疑问
920358
kmguochang楼主2024/10/23 19:40

动态开点的第一个区间范围对于本题的影响很奇怪

最大区间 -1e10~1e10-> AC 0~1e10-> 10pts mle前九个点

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=6e6+666;
const ll inf=1e10;
struct tree{
    int ls,rs,lzy;
    ll data;
}t[N];
int n,cnt;
ll s[N],ans,ln,rn;
inline void spread(int p,ll l,ll r){
    if(!t[p].lzy)
        return;
    if(!t[p].ls)
    t[p].ls=++cnt,t[cnt]=tree{0,0,0,0ll};
    if(!t[p].rs)
    t[p].rs=++cnt,t[cnt]=tree{0,0,0,0ll};
    int rson=t[p].rs,lson=t[p].ls;
    ll mid=l+r>>1;
    t[lson].lzy+=t[p].lzy;
    t[lson].data+=(mid-l+1)*t[p].lzy;
    t[rson].lzy+=t[p].lzy;
    t[rson].data+=(r-mid)*t[p].lzy;
    t[p].lzy=0;
    return;
}
inline void update(int p,ll l,ll r,int pre,ll L=-inf,ll R=inf){
    if(L>=l&&R<=r){
        t[p].data+=(ll)pre*(R-L+1);
        t[p].lzy+=pre;
        return;
    }
    if(L>R)
        return;
    spread(p,L,R);
    ll mid=L+R>>1;
    if(l<=mid){
        if(!t[p].ls)
        t[++cnt]=tree{0,0,0,0ll},t[p].ls=cnt;
        update(t[p].ls,l,r,pre,L,mid);
    }
    if(r>mid){
        if(!t[p].rs)
        t[++cnt]=tree{0,0,0,0ll},t[p].rs=cnt;
        update(t[p].rs,l,r,pre,mid+1,R);
    }
    t[p].data=t[t[p].ls].data+t[t[p].rs].data;
    return;
}
inline ll query(int p,ll l,ll r,ll L=-inf,ll R=inf){
    ll ans=0ll;
    if(L>=l&&R<=r)
        return t[p].data;
    if(L>R)
        return 0ll;
    spread(p,L,R);
    ll mid=L+R>>1;
    if(l<=mid){
        if(!t[p].ls)
        t[p].ls=++cnt,t[cnt]=tree{0,0,0,0ll};
        ans+=query(t[p].ls,l,r,L,mid);
    }
    if(r>mid){
        if(!t[p].rs)
        t[p].rs=++cnt,t[cnt]=tree{0,0,0,0ll};
        ans+=query(t[p].rs,l,r,mid+1,R);
    }
    return ans;
}
int main(){
    int x;
    scanf("%d%lld%lld",&n,&ln,&rn);
    for(int i=1;i<=n;++i){
        scanf("%d",&x);
        s[i]=s[i-1]+x;
    }
    t[++cnt]=tree{0,0,0,0ll};
    update(1,0ll,0ll,1);
    for(int i=1;i<=n;++i){
        ans+=query(1,s[i]-rn,s[i]-ln);
        update(1,s[i],s[i],1);
    }
    printf("%lld",ans);
    return 0;
}
2024/10/23 19:40
加载中...