zoj 3284 Matrix Processing(二维树状数组)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3623
简单二维树状数组题。单点询问,两种更新(按行或者按列)。直接用二维的线段树,最多将更新的区间划分为3个。
代码如下:
![](/assets/blank.gif)
![](/assets/blank.gif)
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(二维树状数组)相关推荐
- POJ2155 - Matrix(二维树状数组)
POJ2155 - Matrix 文章目录 题目 题解: 代码 题目 给你一个二维矩阵,初始化为0,然后可以进行两次操作: C:x,y,x1,y2 对该小矩阵内的数进行取反 Q:查询某个点是0还是1 ...
- Hihocoer 1336 - Matrix Sum 二维树状数组
题意 给我们个n*n的矩阵 有m个操作让我们 操作有两种 Add x y v对(x,y)上的元素加v Sum x1 y1 x2 y2 对(x1,y1)为左上角(x2,y2)为右下角的矩阵求和并mod ...
- Matrix(二维树状数组)入门第一题
题目链接:http://poj.org/problem?id=2155 Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissio ...
- 【CF869E】The Untended Antiquity(哈希+二维树状数组)
当覆盖两点的最小矩形不同时,一定不可达 这样的问题不难想到经典的二维树状数组+差分来支持二维区间覆盖+查询 对于覆盖操作 我们可以差分的给这个矩阵里加上一个编号 对于操墙操作 我们可以反着减去这个编号 ...
- 二维树状数组 ----2021广东省赛 ----- K - Kera‘s line segment[区间转二维平面+树状数组维护前缀最小最大值]
题目链接 题目大意: 就是一个一维的数轴上面有一堆线段用一个三元组(l,r,val)(l,r,val)(l,r,val)表示. 现在我们有两个操作: 就是往数轴上面添加线段 询问[L,R][L,R][ ...
- szu 寒训第二天 树状数组 二维树状数组详解,以及树状数组扩展应用【求逆序对,以及动态第k小数】
树状数组(Binary Index Tree) 树状数组可以解决可以转化为前缀和问题的问题 这是一类用以解决动态前缀和的问题 (有点像线段树简版) 1.对于 a1 + a2 + a3 + - + an ...
- 【二维树状数组】See you~
https://www.bnuoj.com/v3/contest_show.php?cid=9148#problem/F [题意] 给定一个矩阵,每个格子的初始值为1.现在可以对矩阵有四种操作: A ...
- POJ_1195 Mobile phones 【二维树状数组】
题目链接:http://poj.org/problem?id=1195 纯纯的二维树状数组,不解释,仅仅须要注意一点,由于题目中的数组从0開始计算,所以维护的时候须要加1.由于树状数组的下标是不能为1 ...
- 洛谷1527(bzoj2738)矩阵乘法——二维树状数组+整体二分
题目:https://www.luogu.org/problemnew/show/P1527 不难想到(?)可以用二维树状数组.但维护什么?怎么查询是难点. 因为求第k小,可以考虑记权值树状数组,把比 ...
- 二维树状数组 BZOJ 1452 [JSOI2009]Count
题目链接 裸二维树状数组 #include <bits/stdc++.h>const int N = 305; struct BIT_2D {int c[105][N][N], n, m; ...
最新文章
- javascript跳跃式前进(3) - 跳入JSON
- [转]php curl 设置host curl_setopt CURLOPT_HTTPHEADER 指定host
- 08.Eclipse下Ndk开发(使用fmod实现QQ变声功能)
- MySQL利用磁盘缓存写入_MySQL写入缓冲区在数据库中的作用( Change Buffer )
- php 简单的socket,【技术产品】PHP如何实现简单的Socket
- Ubuntu php安装过程,ubuntu安装lemp步骤
- java. base关键字_C#基础知识之base关键字介绍
- 根据银行卡号判断银行卡是否正确与归属银行
- 普中V2 7人多数表决器 51单片机 仿真 proteus
- 7.1 php7.0 微擎_php7.1以上微擎-人人商城小程序授权登录问题
- vue插槽面试题_vue面试题总结
- 3.深入了解listen函数
- python无限制邮件群发软件_有哪些逆天的邮件群发软件推荐?
- 618省心凑背后的新算法——个性化凑单商品打包购推荐
- php怎样规定密码混合,PHP产生随机字串,可用来自动生成密码 默认长度6位 字母和数字混合...
- 创业语录(转)(动态添加中)
- MATLAB-工具箱-如何导出拟合系数?
- linux 命令行大全
- 区块链基于WebSocket 构建P2P网络
- c 语言中eof 是什么,什么是C编程语言中的EOF?
热门文章
- kernel命令行参数(grub启动项参数)
- Android 存储学习之在内部存储中读写文件
- 在Ubuntu10.10下升级内核到2.6.36使用systemtap
- allwinner 全志uboot git网址 及其他相关链接
- 如何安装Scrapy
- linux 目录与分区与文件,LINUX中的分区与文件系统
- 无法进入一个空框_DeNoise AI无法从Photoshop作为插件启动?
- python递增文件名_python-文件存在时文件名中的数字递增
- java遍历d盘所有文件夹_java遍历指定盘符的所有文件和文件夹
- linux档案内容怎么写,Linux cat输出档案命令详解