poj 1195 Mobile phones 【二维树状数组】

来源:互联网 发布:talk聊天软件 编辑:程序博客网 时间:2024/05/29 15:22

题目链接:poj 1195 Mobile phones

题意:nn矩阵。操作
1、0n 清空矩阵元素为0,建立nn矩阵;
2、1xyd 矩阵元素(x,y)d
3、2x1y1x2y2求解以(x1,y1)为左上角(x2,y2)为右下角的矩阵元素和。

单点修改、求和时间复杂度O(lognlogn)
AC代码:

#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <algorithm>#include <vector>#include <queue>#include <map>#include <stack>#define PI acos(-1.0)#define CLR(a, b) memset(a, (b), sizeof(a))#define fi first#define se second#define ll o<<1#define rr o<<1|1using namespace std;typedef long long LL;typedef pair<int, int> pii;const int MAXN = 1100 + 10;const int pN = 1e6;// <= 10^7const int INF = 0x3f3f3f3f;const int MOD = 1e9 + 7;void add(LL &x, LL y) { x += y; x %= MOD; }LL C[MAXN][MAXN];int n;int lowbit(int x) {    return x & (-x);}void add(int x, int y, int d) {    while(x <= n) {        int sy = y;        while(sy <= n) {            C[x][sy] += d;            sy += lowbit(sy);        }        x += lowbit(x);    }}LL Sum(int x, int y) {    LL ans = 0;    while(x > 0) {        int sy = y;        while(sy > 0) {            ans += C[x][sy];            sy -= lowbit(sy);        }        x -= lowbit(x);    }    return ans;}int main(){    while(1)    {        int op; scanf("%d", &op);        int a, b, c, d;        if(op == 0) {            scanf("%d", &n);            CLR(C, 0);        }        else if(op == 1) {            scanf("%d%d%d", &a, &b, &c);            a++; b++;            add(a, b, c);        }        else if(op == 2) {            scanf("%d%d%d%d", &a, &b, &c, &d);            a++; b++; c++; d++;            printf("%lld\n", Sum(c, d) - Sum(a-1, d) - Sum(c, b-1) + Sum(a-1, b-1));        }        else {            return 0;        }    }    return 0;}
0 0
原创粉丝点击