POJ 1195 Mobile phones 二维线段树

来源:互联网 发布:linux下android studio 编辑:程序博客网 时间:2024/06/06 14:18

题目:

http://poj.org/problem?id=1195

题意:

给出一个s*s的矩阵,有以下四种操作:

  • 0 S 把一个S*S的矩阵全初始化为0,这个操作仅在最初执行一次
  • 1 X Y A 把(X, Y)处的元素加上A
  • 2 L B R T 查询以(L, R)为左上角、(B, T)为右下角的矩阵内元素的和
  • 3 结束操作

思路:

二维线段树,很裸的题目了。。。不裸的话,有二维线段树写起来很麻烦,而且空间很容易被卡,感觉有点鸡肋啊。。。

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 1000 + 26, INF = 0x3f3f3f3f;int n;int sum[N<<2][N<<2];void push_upy(int ky, int kx){    sum[kx][ky] = sum[kx][ky<<1] + sum[kx][ky<<1|1];}void push_upx(int ky, int kx){    sum[kx][ky] = sum[kx<<1][ky] + sum[kx<<1|1][ky];}void updatey(int y, int L, int R, int ky, int kx, int val, int f){    if(L == R)    {        if(f) sum[kx][ky] += val;        else push_upx(ky, kx);        return;    }    int mid = (L + R) >> 1;    if(y <= mid) updatey(y, L, mid, ky << 1, kx, val, f);    else updatey(y, mid + 1, R, ky << 1|1, kx, val, f);    push_upy(ky, kx);}void updatex(int x, int y, int L, int R, int kx, int val){    if(L == R)    {        updatey(y, 1, n, 1, kx, val, 1); return;    }    int mid = (L + R) >> 1;    if(x <= mid) updatex(x, y, L, mid, kx << 1, val);    else updatex(x, y, mid + 1, R, kx << 1|1, val);    updatey(y, 1, n, 1, kx, val, 0);}int queryy(int ly, int ry, int L, int R, int ky, int kx){    if(ly <= L && R <= ry) return sum[kx][ky];    int mid = (L + R) >> 1, ans = 0;    if(ly <= mid) ans += queryy(ly, ry, L, mid, ky << 1, kx);    if(ry > mid) ans += queryy(ly, ry, mid + 1, R, ky << 1|1, kx);    return ans;}int queryx(int lx, int rx, int ly, int ry, int L, int R, int kx){    if(lx <= L && R <= rx) return queryy(ly, ry, 1, n, 1, kx);    int mid = (L + R) >> 1, ans = 0;    if(lx <= mid) ans += queryx(lx, rx, ly, ry, L, mid, kx << 1);    if(rx > mid) ans += queryx(lx, rx, ly, ry, mid + 1, R, kx << 1|1);    return ans;}int main(){    int op;    //memset(sum, 0, sizeof sum);    while(scanf("%d", &op), op != 3)    {        if(op == 0) scanf("%d", &n);        else if(op == 1)        {            int x, y, val;            scanf("%d%d%d", &x, &y, &val);            x++, y++;            updatex(x, y, 1, n, 1, val);        }        else if(op == 2)        {            int l, b, r, t;            scanf("%d%d%d%d", &l, &b, &r, &t);            l++, b++, r++, t++;            printf("%d\n", queryx(l, r, b, t, 1, n, 1));        }    }    return 0;}