if(x[mid+1]>qx)update(l,mid,root<<1,v);
if(x[mid+1]<qy)update(mid+1,r,root<<1|1,v);
上面的代码中,线段树上的 [l,r] 区间对应实际区间 [xl,xr+1]。qx 和 qy 分别表示矩形边的左右端点。
由于一条边 [l,r] 的长度为 r−l,比区间包含的点数小一,所以这里我们钦定 [l,r−1] 所含的点表示 [l,r] 的长度。
-
对于左区间,线段树上的区间是 [l,mid],实际对应的点是 [xl,xmid+1−1],xmid+1 是改不到的,所以当且仅当 xmid+1−1≥qx,也就是 xmid+1>qx 时,才能修改左区间;
-
对于右区间,线段树上的区间是 [mid+1,r],实际对应的点是 [xmid+1,xr−1],xr 是改不到的,所以当且仅当 xmid+1≤qy−1,也就是 xmid+1<qy 时,才能修改右区间。