解释线段树递归的操作
查看原帖
解释线段树递归的操作
536337
eb0ycn楼主2024/4/2 14:01
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][l,r] 区间对应实际区间 [xl,xr+1][x_l,x_{r+1}]。qxqx 和 qyqy 分别表示矩形边的左右端点。

由于一条边 [l,r][l,r] 的长度为 r−lr-l,比区间包含的点数小一,所以这里我们钦定 [l,r−1][l,r-1] 所含的点表示 [l,r][l,r] 的长度。

  • 对于左区间,线段树上的区间是 [l,mid][l,mid],实际对应的点是 [xl,xmid+1−1][x_l,x_{mid+1}-1],xmid+1x_{mid+1} 是改不到的,所以当且仅当 xmid+1−1≥qxx_{mid+1}-1 \ge qx,也就是 xmid+1>qxx_{mid+1}> qx 时,才能修改左区间;

  • 对于右区间,线段树上的区间是 [mid+1,r][mid+1,r],实际对应的点是 [xmid+1,xr−1][x_{mid+1},x_r-1],xrx_r 是改不到的,所以当且仅当 xmid+1≤qy−1x_{mid+1} \leq qy-1,也就是 xmid+1<qyx_{mid+1} < qy 时,才能修改右区间。

2024/4/2 14:01
加载中...