萌新求助
查看原帖
萌新求助
557754
Kalenist楼主2023/8/14 22:36

线段树维护 00 的个数,转化成维护非 00 个数再减去,但是 WA60ptsW A 60pts 。脑补了一下没发现问题,求HACK。

int adt[N<<2],sum[N<<2];
inline void pushup(int k,int l,int r){sum[k]=adt[k]?r-l+1:(l==r?0:sum[lc]+sum[rc]);}

inline void pushdown(int k,int l,int r)
{
    if(!adt[k]) return;
    int mid=l+r>>1;
    adt[lc]+=adt[k],adt[rc]+=adt[k];
    pushup(lc,l,mid),pushup(rc,mid+1,r);
    return void(adt[k]=0);
}

inline void modify(int k,int l,int r,int x,int y,int d)
{
    if(x > y) return;
    if(l >= x && r <= y) {adt[k]+=d;return pushup(k,l,r);}
    int mid=l+r>>1;pushdown(k,l,r);
    if(x <= mid) modify(lc,l,mid,x,y,d);
    if(mid < y) modify(rc,mid+1,r,x,y,d);
    return pushup(k,l,r);
}

inline int query(int k,int l,int r,int x,int y)
{
    if(l >= x && r <= y) return sum[k];
    int mid=l+r>>1,res=0;pushdown(k,l,r);
    if(x <= mid) res+=query(lc,l,mid,x,y);
    if(mid < y) res+=query(rc,mid+1,r,x,y);
    return res;
}


2023/8/14 22:36
加载中...