http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3623

  简单二维树状数组题。单点询问,两种更新(按行或者按列)。直接用二维的线段树,最多将更新的区间划分为3个。

代码如下:

View Code

  1 #include <cstdio>
  2 #include <cstdlib>
  3 #include <algorithm>
  4
  5 using namespace std;
  6
  7 const int size = 105;
  8
  9 struct BIT2D {
 10     int key[size][size];
 11     int row, col; //   x-row   y-col
 12
 13     void init() {
 14         for (int i = 0; i <= row; i++) {
 15             for (int j = 0; j <= col; j++) {
 16                 key[i][j] = 0;
 17             }
 18         }
 19     }
 20
 21     void addMain(int x, int y, int k) {
 22         if (!x || !y) return ;
 23         for (int i = x; i > 0; i -= (-i) & i) {
 24             for (int j = y; j > 0; j -= (-j) & j) {
 25                 key[i][j] += k;
 26             }
 27         }
 28     }
 29
 30     void add(int x1, int y1, int x2, int y2, int k) {
 31         addMain(x1 - 1, y1 - 1, k);
 32         addMain(x1 - 1, y2, -k);
 33         addMain(x2, y1 - 1, -k);
 34         addMain(x2, y2, k);
 35     }
 36
 37     int getPoint(int x, int y) {
 38         int ret = 0;
 39
 40         for (int i = x; i <= row; i += (-i) & i) {
 41             for (int j = y; j <= col; j += (-j) & j) {
 42                 ret += key[i][j];
 43             }
 44         }
 45
 46         return ret;
 47     }
 48 } BIT;
 49
 50 void addCol(int x1, int y1, int x2, int y2, int k) {
 51     if (x1 == x2) {
 52         BIT.add(x1, y1, x2, y2, k);
 53     } else {
 54         BIT.add(x1, y1, x1, BIT.col, k);
 55         if (x2 - x1 > 1) {
 56             BIT.add(x1 + 1, 1, x2 - 1, BIT.col, k);
 57         }
 58         BIT.add(x2, 1, x2, y2, k);
 59     }
 60 }
 61
 62 void addRow(int x1, int y1, int x2, int y2, int k) {
 63     if (y1 == y2) {
 64         BIT.add(x1, y1, x2, y2, k);
 65     } else {
 66         BIT.add(x1, y1, BIT.row, y1, k);
 67         if (y2 - y1 > 1) {
 68             BIT.add(1, y1 + 1, BIT.row, y2 - 1, k);
 69         }
 70         BIT.add(1, y2, x2, y2, k);
 71     }
 72 }
 73
 74 int main() {
 75     int Case = 1, m;
 76
 77 //    freopen("in", "r", stdin);
 78     while (~scanf("%d%d", &BIT.row, &BIT.col)) {
 79         BIT.init();
 80         printf("Case %d\n", Case);
 81         Case++;
 82         for (int i = 1, x; i <= BIT.row; i++) {
 83             for (int j = 1; j <= BIT.col; j++) {
 84                 scanf("%d", &x);
 85                 addRow(i, j, i, j, x);
 86             }
 87         }
 88         /*
 89         for (int i = 1; i <= BIT.row; i++) {
 90             for (int j = 1; j <= BIT.col; j++) {
 91                 printf("%d ", BIT.getPoint(i, j));
 92             }
 93             puts("");
 94         }
 95         */
 96         scanf("%d", &m);
 97
 98         int op, a, b, c, d, e;
 99
100         while (m--) {
101             scanf("%d", &op);
102             if (op == 0) {
103                 scanf("%d%d%d%d%d", &a, &b, &c, &d, &e);
104                 if (a > c) {
105                     swap(a, c);
106                     swap(b, d);
107                 } else if (a == c && b > d) {
108                     swap(b, d);
109                 }
110                 addCol(a, b, c, d, e);
111             } else if (op == 1) {
112                 scanf("%d%d%d%d%d", &a, &b, &c, &d, &e);
113                 if (b > d) {
114                     swap(b, d);
115                     swap(a, c);
116                 } if (b == d && a > c) {
117                     swap(a, c);
118                 }
119                 addRow(a, b, c, d, e);
120             } else {
121                 scanf("%d%d", &a, &b);
122                 printf("%d\n", BIT.getPoint(a, b));
123             }
124             /*
125             for (int i = 1; i <= BIT.row; i++) {
126                 for (int j = 1; j <= BIT.col; j++) {
127                     printf("%d ", BIT.getPoint(i, j));
128                 }
129                 puts("");
130             }
131             */
132         }
133     }
134
135     return 0;
136 }

——written by Lyon

转载于:https://www.cnblogs.com/LyonLys/archive/2012/11/05/zoj_3284_Lyon.html

zoj 3284 Matrix Processing(二维树状数组)相关推荐

  1. POJ2155 - Matrix(二维树状数组)

    POJ2155 - Matrix 文章目录 题目 题解: 代码 题目 给你一个二维矩阵,初始化为0,然后可以进行两次操作: C:x,y,x1,y2 对该小矩阵内的数进行取反 Q:查询某个点是0还是1 ...

  2. Hihocoer 1336 - Matrix Sum 二维树状数组

    题意 给我们个n*n的矩阵 有m个操作让我们 操作有两种 Add x y v对(x,y)上的元素加v Sum x1 y1 x2 y2 对(x1,y1)为左上角(x2,y2)为右下角的矩阵求和并mod ...

  3. Matrix(二维树状数组)入门第一题

    题目链接:http://poj.org/problem?id=2155 Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissio ...

  4. 【CF869E】The Untended Antiquity(哈希+二维树状数组)

    当覆盖两点的最小矩形不同时,一定不可达 这样的问题不难想到经典的二维树状数组+差分来支持二维区间覆盖+查询 对于覆盖操作 我们可以差分的给这个矩阵里加上一个编号 对于操墙操作 我们可以反着减去这个编号 ...

  5. 二维树状数组 ----2021广东省赛 ----- K - Kera‘s line segment[区间转二维平面+树状数组维护前缀最小最大值]

    题目链接 题目大意: 就是一个一维的数轴上面有一堆线段用一个三元组(l,r,val)(l,r,val)(l,r,val)表示. 现在我们有两个操作: 就是往数轴上面添加线段 询问[L,R][L,R][ ...

  6. szu 寒训第二天 树状数组 二维树状数组详解,以及树状数组扩展应用【求逆序对,以及动态第k小数】

    树状数组(Binary Index Tree) 树状数组可以解决可以转化为前缀和问题的问题 这是一类用以解决动态前缀和的问题 (有点像线段树简版) 1.对于 a1 + a2 + a3 + - + an ...

  7. 【二维树状数组】See you~

    https://www.bnuoj.com/v3/contest_show.php?cid=9148#problem/F [题意] 给定一个矩阵,每个格子的初始值为1.现在可以对矩阵有四种操作: A ...

  8. POJ_1195 Mobile phones 【二维树状数组】

    题目链接:http://poj.org/problem?id=1195 纯纯的二维树状数组,不解释,仅仅须要注意一点,由于题目中的数组从0開始计算,所以维护的时候须要加1.由于树状数组的下标是不能为1 ...

  9. 洛谷1527(bzoj2738)矩阵乘法——二维树状数组+整体二分

    题目:https://www.luogu.org/problemnew/show/P1527 不难想到(?)可以用二维树状数组.但维护什么?怎么查询是难点. 因为求第k小,可以考虑记权值树状数组,把比 ...

  10. 二维树状数组 BZOJ 1452 [JSOI2009]Count

    题目链接 裸二维树状数组 #include <bits/stdc++.h>const int N = 305; struct BIT_2D {int c[105][N][N], n, m; ...

最新文章

  1. javascript跳跃式前进(3) - 跳入JSON
  2. [转]php curl 设置host curl_setopt CURLOPT_HTTPHEADER 指定host
  3. 08.Eclipse下Ndk开发(使用fmod实现QQ变声功能)
  4. MySQL利用磁盘缓存写入_MySQL写入缓冲区在数据库中的作用( Change Buffer )
  5. php 简单的socket,【技术产品】PHP如何实现简单的Socket
  6. Ubuntu php安装过程,ubuntu安装lemp步骤
  7. java. base关键字_C#基础知识之base关键字介绍
  8. 根据银行卡号判断银行卡是否正确与归属银行
  9. 普中V2 7人多数表决器 51单片机 仿真 proteus
  10. 7.1 php7.0 微擎_php7.1以上微擎-人人商城小程序授权登录问题
  11. vue插槽面试题_vue面试题总结
  12. 3.深入了解listen函数
  13. python无限制邮件群发软件_有哪些逆天的邮件群发软件推荐?
  14. 618省心凑背后的新算法——个性化凑单商品打包购推荐
  15. php怎样规定密码混合,PHP产生随机字串,可用来自动生成密码 默认长度6位 字母和数字混合...
  16. 创业语录(转)(动态添加中)
  17. MATLAB-工具箱-如何导出拟合系数?
  18. linux 命令行大全
  19. 区块链基于WebSocket 构建P2P网络
  20. c 语言中eof 是什么,什么是C编程语言中的EOF?

热门文章

  1. kernel命令行参数(grub启动项参数)
  2. Android 存储学习之在内部存储中读写文件
  3. 在Ubuntu10.10下升级内核到2.6.36使用systemtap
  4. allwinner 全志uboot git网址 及其他相关链接
  5. 如何安装Scrapy
  6. linux 目录与分区与文件,LINUX中的分区与文件系统
  7. 无法进入一个空框_DeNoise AI无法从Photoshop作为插件启动?
  8. python递增文件名_python-文件存在时文件名中的数字递增
  9. java遍历d盘所有文件夹_java遍历指定盘符的所有文件和文件夹
  10. linux档案内容怎么写,Linux cat输出档案命令详解