在写关于二维差分的时候
发现可以找规律来写 例如 预处理差分数组的时候
void insert(int x1,int y1,int x2,int y2,int c){
b[x1][y1] += c;
b[x1][y2+1] -=c;
b[x2+1][y1] -= c;
b[x2+1][y2+1] +=c;
}
同过上面 可以发现一个规律 只有奇数个 +1 的时候就是 - 号 且加1 的一定是 相反的坐标除了最后一个
相反的坐标(比如前面是x1 , 后面一定是y2, 而不是 y1)
求前缀和的时候的发现
b[i][j] += b[i-1][j] + b[i][j-1] -b[i-1][j-1];
对于奇数个减去 1 符号为 + ,偶数则为 负;
通过上述规律 可以开始写三维差分的处理方式 具体题目 三体攻击
void add(int x1,int x2,int y1, int y2 ,int z1 ,int z2 ,int c){
b[get(x1,y1,z1)] += c;
b[get(x1,y2+1,z1)] -= c;
b[get(x1,y1,z2+1)] -= c;
b[get(x2+1,y1,z1)] -= c;
b[get(x2+1,y2+1,z1)] += c;
b[get(x2+1,y1,z2+1)] += c;
b[get(x1,y2+1,z2+1)] += c;
b[get(x2+1,y2+1,z2+1)] -= c;
}
规律和二维是一样的
处理前缀和
s[get(i,j,k)] = tmp[get(i,j,k)] + s[get(i,j-1,k)] + s[get(i,j,k-1)] + s[get(i-1,j,k)]
- s[get(i-1,j-1,k)] - s[get(i-1,j,k-1)] - s[get(i,j-1,k-1)] + s[get(i-1,j-1,k-1)];
对于二维子矩阵的和 规律 奇数个 -1 为负数 ,偶数则为正数
// 前缀和
s[i][j] = s[i-1][j] + s[i][j-1] -s[i-1][j-1] +a[i][j];
// 求对应的子矩阵
s[x2][y2] - s[x1-1][y2] - s[x2][y1-1] +s[x1-1][y1-1]
对于三维应该也一样的规律
s[x2][y2][z2] - s[x2][y2][z1 - 1] - s[x2][y1 - 1][z2] - s[x1- 1][y2][z2]
+ s[x2][y1 - 1][z1 - 1] + s[x1 - 1][y2][z1 - 1] + s[x1 - 1][y1 - 1][z2]
- s[x1 - 1][y1 - 1][z1 - 1] ;