其实二维差分和一维差分一样,就是更新时一维是更新两个点,二维的更新四个点,然后询问某一个点的值都是前缀和。
++b[x1][y1]; ++b[x2][y2]; --b[x1][y2]; --b[x2][y1];
这样子我就可以更新以(x1,y1)和(x2-1,y2-1)为两个对顶角的矩形,
然后最后要求前缀和
for(int i=0;i<n;++i){ for(int j=0;j<n-1;++j){ b[i][j+1]+=b[i][j]; } } for(int i=0;i<n;++i){ for(int j=0;j<n-1;++j){ b[j+1][i]+=b[j][i]; } }
先求行的前缀和,再求列的前缀和