POJ 1195 Mobile phones (二维树状树组)

简介: 题意:这道题目只是题意自己就去理解了半天,大概题意如下:给出i一个n*n的矩阵,初始化为均为0,还有关于这个矩阵的几种操作,操作如下:命令1:(X Y A)对位于坐标(X Y)的值加A;命令2:(L B R T)求出位于L<=x<=R,B<=y<=T的值的和;命令3:退出不做任何操作。

由于英语极差,看了半天也没看懂题目,最后参考了其他人的题解才搞懂题目,我就直接把题意贴过来了


 


题意:这道题目只是题意自己就去理解了半天,大概题意如下:给出i一个n*n的矩阵,初始化为均为0,还有关于这个矩阵的几种操作,操作如下:命令1:(X Y A)对位于坐标(X Y)的值加A;命令2:(L B R T)求出位于L<=x<=R,B<=y<=T的值的和;命令3:退出不做任何操作。



思路分析如下:二维树状数组,典型的动态操作题目。查询子矩阵(x,y,xx,yy)的元素和,注意一下就可以了:sum(xx, yy)-sum(x-1, yy)-sum(xx, y-1)+sum(x-1,y-1);


     这是我做的第一道二维树状树组的题目,感觉和一维的差不多,下面是题解。


//poj 1195
#include <stdio.h>
#include <string.h>
const int maxn = 1030;
int n, a[maxn][maxn];
int lowbit(int x)
{
    return x & (-x);
}
void update(int i, int j, int v)
{
    int t;
     while(i <= n)
     {
         t = j;                        //不能改变j的值,因为每次循环都要用到
         while (t <= n)
         {
             a[i][t] += v;
             t += lowbit(t);
         }
         i += lowbit(i);
     }
}
int getsum(int i, int j)
{
    int sum = 0, t;
    while (i > 0)
    {
        t = j;                          //不能改变j的值,因为每次循环都要用到
        while (t > 0)
        {
            sum += a[i][t];
            t -= lowbit(t);
        }
        i -= lowbit(i);
    }
    return sum;
}
int main()
{
    int op, x, y, v, xx, yy;
    while (scanf("%d%d",&op,&n) != EOF)
    {
        memset(a, 0, sizeof(a));
        while (scanf("%d",&op) && op != 3)
        {
            if (op == 1)
            {
                scanf("%d%d%d",&x, &y, &v);
                x++; y++;                         //树状数组坐标是从1开始的,以此要加1
                update(x, y, v);
            }
            else
            {
                scanf("%d%d%d%d", &x, &y, &xx, &yy);
                x ++, y ++, xx ++, yy ++;
                int ans = getsum(xx, yy) - getsum(x-1, yy) - getsum(xx, y-1) + getsum(x-1, y-1);
                // 每次getsum(i, j); 得到的结果是(i,j)前面所有数的和 
                printf("%d\n", ans);
            }
        }
    }
    return 0;
}


目录
相关文章
图的基本术语,邻接矩阵、邻接表表示方法
图的基本术语,邻接矩阵、邻接表表示方法
|
存储 索引
树与图中的dfs和bfs—— AcWing 846. 树的重心 AcWing 847. 图中点的层次
树与图中的dfs和bfs—— AcWing 846. 树的重心 AcWing 847. 图中点的层次
73 0
|
JavaScript 前端开发 API
C/C++ Qt TreeWidget 单层树形组件应用
TreeWidget 目录树组件,该组件适用于创建和管理目录树结构,在开发中我们经常会把它当作一个升级版的`ListView`组件使用,因为`ListView`每次只能显示一列数据集,而使用`TableWidget`组件显示多列显得不够美观,此时使用Tree组件显示单层结构是最理想的方式,本章博文将通过`TreeWidget`实现多字段显示,并增加一个自定义菜单,通过在指定记录上右键可弹出该菜单并对指定记录进行操作。
C/C++ Qt TreeWidget 单层树形组件应用
POJ1269 Intersecting Lines(两直线关系)
POJ1269 Intersecting Lines(两直线关系)
57 0
L2-023 图着色问题 (25 分)(图论)
L2-023 图着色问题 (25 分)(图论)
383 0
POJ-1308,Is It A Tree?(并查集和树)
POJ-1308,Is It A Tree?(并查集和树)
[USACO | UPC] Liars and Truth Tellers | 拓展域并查集
题目描述 After spending so much time around his cows, Farmer John has started to understand their language. Moreover, he notices that among his N cows (2 ≤ N ≤ 1000 ), some always tell the truth while others always lie.
123 0