• 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:退出不做任何操作。

    思路分析如下:二维树状数组,典型的动态操作题目。查询子矩阵(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;
    }
    


     

      

  • 相关阅读:
    禅道使用-升级
    Maven 的这 7 个问题你思考过没有?
    https及证书
    Linux下查看/管理当前登录用户及用户操作历史记录
    禅道的安装
    Linux添加/删除用户和用户组
    Spring注解@Component、@Repository、@Service、@Controller区别 .
    myeclipse,eclipse打开当前文件所在文件夹
    java开发常用工具
    Django环境搭建之安装mod_wsgi模块
  • 原文地址:https://www.cnblogs.com/xindoo/p/3595159.html
Copyright © 2020-2023  润新知