线段树维护 0 的个数,转化成维护非 0 个数再减去,但是 WA60pts 。脑补了一下没发现问题,求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;
}