Bzoj3132 二维树状数组

来源:互联网 发布:4g网络优化初级工程师 编辑:程序博客网 时间:2024/06/05 01:58

这个东西真的好神。。。


第一次发现原来树状数组也可以这么神。。。


首先可以考虑一下一维情况的树状数组的段修改和段查询


做法是两颗树状数组分别维护询问范围小于当前修改范围的贡献值

和询问范围大于当前修改范围的贡献值


但是二维呢。。。

就需要四个树状数组了

具体做法感觉wyl8899讲的很好我没必要重复了。。


http://hi.bai  网址  du.com/wyl8899/item  网址  /c3ac1c0eec3516ea34990267


#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>#define MAX 2222#define rep(i, j, k) for (int i = j; i <= k; i++)#define lowbit(x) (x & -x )using namespace std;int n, m, x1, y1, x2, y2, delta;struct wbysr{int s[MAX][MAX];inline void add (int x, int y, int value){for (; x <= n; x += lowbit (x))for(int j = y; j <= m; j += lowbit(j))s[x][j] += value;}inline int sum (int x, int y){int ret = 0;for (; x; x -= lowbit (x))for (int j = y; j; j -= lowbit (j))ret += s[x][j];return ret;}}b1, b2, b3, b4;inline void update (int x, int y, int value) {if (!x || !y)return;b1.add (x, y, x * y * value);b2.add (x, 1, x * value), b2.add (x, y, -x * value);b3.add (1, y, y * value), b3.add (x, y, -y * value);b4.add (1, 1, value), b4.add (x, y, value);b4.add (x, 1, -value), b4.add (1, y, -value);}inline int ask (int x, int y){if (!x || !y)return 0;return b1.sum (x, y) + b2.sum (x, y) * y + b3.sum (x, y) * x + b4.sum (x, y) * x * y;}int main(){char control;scanf ("%c%d%d", &control, &n, &m);while (getchar(), scanf("%c%d%d%d%d", &control, &x1, &y1, &x2, &y2)){if (control == 'L'){scanf ("%d", &delta);update (x2, y2, delta);update (x1 - 1, y1 - 1, delta);update (x2, y1 - 1, -delta);update (x1 - 1, y2, -delta);}elseprintf ("%d\n", ask (x2, y2) + ask (x1 - 1, y1 - 1) - ask (x2, y1 - 1) - ask (x1 - 1, y2));}return 0;}


0 0
原创粉丝点击