poj2155Matrix【二位树状数组】

大意:告诉你一个矩阵,初始值全部为0,有两种操作,1、告诉你x1,y1, x2, y2 把左上角到右下角的矩形的里面的值全部颠倒   1变0  0变1

第二种操作是查询某个点的值是0或1

分析:二维的标号法, 对于每一个矩阵只要把它的四个角进行标记就可以了, 最基本的思路跟理工门前的树是一样的

举个例子:

比如告诉你左上角(x1, y1) 右下角(x2, y2)

那么对于这个矩形  我们只要把(x1, y1),(x1 + 1, y2),(x2 + 1, y1),(x2 + 1, y2 + 1)标记上

那么对于每次查询的话该位置的值就是从该位置到(1, 1)这个矩阵之内的所有的数的和

代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5
 6 const int maxn = 1005;
 7
 8 int lowbit(int x) {
 9     return x & ( - x );
10 }
11
12 int c[maxn][maxn];
13 int n;
14
15 void add(int i, int j, int value) {
16     int xx = j;
17     while(i <= n) {
18         j = xx;
19         while(j <= n) {
20             c[i][j] += value;
21             j += lowbit(j);
22         }
23         i += lowbit(i);
24     }
25 }
26
27 int Sum(int i, int j) {
28     int xx = j;
29     int sum = 0;
30     while(i > 0) {
31         j = xx;
32         while(j > 0) {
33             sum += c[i][j];
34             j -= lowbit(j);
35         }
36         i -= lowbit(i);
37     }
38     return sum;
39 }
40
41 int main() {
42     int t;
43     int m;
44     char cc;
45     int x1, y1, x2, y2;
46     bool flag = false;
47     scanf("%d",&t);
48     while(t--) {
49         if(flag) puts("");
50         flag = true;
51         scanf("%d %d",&n, &m);
52         memset(c, 0, sizeof(c));
53         for(int i = 1; i <= m; i++) {
54             scanf("\n%c %d %d", &cc, &x1, &y1);
55             if(cc == ‘C‘) {
56                 scanf("%d %d",&x2, &y2);
57                 add(x1, y1, 1);
58                 add(x1, y2 + 1, 1);
59                 add(x2 + 1, y1, 1);
60                 add(x2 + 1, y2 + 1, 1);
61             } else {
62                 printf("%d\n", Sum(x1, y1) % 2 );
63             }
64         }
65     }
66     return 0;
67 }
68     

时间: 2024-10-13 02:31:08

poj2155Matrix【二位树状数组】的相关文章

二维树状数组-POJ-2155-Matrix

Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 23707 Accepted: 8762 Description Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the i-th row and j-th column. Initially we have A[i, j] = 0 (1 <=

tyvj P1716 - 上帝造题的七分钟 二维树状数组区间查询及修改 二维线段树

P1716 - 上帝造题的七分钟 From Riatre    Normal (OI)总时限:50s    内存限制:128MB    代码长度限制:64KB 背景 Background 裸体就意味着身体. 描述 Description “第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵.第二分钟,L说,要能修改,于是便有了将左上角为(a,b),右下角为(c,d)的一个矩形区域内的全部数字加上一个值的操作.第三分钟,k说,要能查询,于是便有了求给定矩形区域内的全部数字和的操作.第

二维树状数组(水题) POJ1195

前段时间遇到线段树过不了,树状数组却过了的题.(其实线段树过得了的) 回忆了下树状数组. 主要原理,还是二进制位数,每一项的和表示其为它的前((最后一位1及其后)的二进制数)和,可从二进制图来看.(用线段树想一想其实只是线段树编号不同而已,本质类似) 写了下二维树状数组,几乎和一维相同,也没必要不同. #include <cstdio> #include <cstring> int l,r,x,y,n,a,p,sum[1125][1125]; inline int lowbit(i

二维树状数组——SuperBrother打鼹鼠(Vijos1512)

树状数组(BIT)是一个查询和修改复杂度都为log(n)的数据结构,主要用于查询任意两位之间的所有元素之和,其编程简单,很容易被实现.而且可以很容易地扩展到二维.让我们来看一道很裸的二维树状数组题: 在一个“打鼹鼠”的游戏中,鼹鼠会不时地从洞中钻出来,不过不会从洞口钻进去(鼹鼠真胆大……).洞口都在一个大小为n(n<=1024)的正方形中.这个正方形在一个平面直角坐标系中,左下角为(0,0),右上角为(n-1,n-1).洞口所在的位置都是整点,就是横纵坐标都为整数的点.而SuperBrother

bzoj3132 上帝造题的七分钟(差分+二维树状数组)

bzoj3132 上帝造题的七分钟(差分+二维树状数组) Time Limit: 20 Sec Memory Limit: 128 MB Description "第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵. 第二分钟,L说,要能修改,于是便有了将左上角为(a,b),右下角为(c,d)的一个矩形区域内的全部数字加上一个值的操作. 第三分钟,k说,要能查询,于是便有了求给定矩形区域内的全部数字和的操作. 第四分钟,彩虹喵说,要基于二叉树的数据结构,于是便有了数据范围. 第五分

【二维树状数组】See you~

https://www.bnuoj.com/v3/contest_show.php?cid=9148#problem/F [题意] 给定一个矩阵,每个格子的初始值为1.现在可以对矩阵有四种操作: A x y n1 :给格点(x,y)的值加n1 D x y n1: 给格点(x,y)的值减n1,如果现在格点的值不够n1,把格点置0 M x1 y1 x2 y2:(x1,y1)移动给(x2,y2)n1个 S x1 y1 x2 y2 查询子矩阵的和 [思路] 当然是二维树状数组 但是一定要注意:lowbi

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

题目链接:POJ 1195 题意: 给出一个S*S的矩阵(行.列号从1开始),每个元素初始值为0,有两种操作:一种是第X行第Y列元素值加A:另一种是查询给定范围矩阵的所有元素之和(L<=X<=R,B<=Y<=T). 分析: 查询给定范围矩阵的所有元素之和是二维区间和,可以转换为二维前缀和求值.类比一维前缀和求法,二维区间和S(L, B, R, T) = S(1, 1, R, T) - S(1 ,1, L-1, T) - S(1, 1, R, B-1) + S(1, 1, L-1,

POJ 2155 Matrix(二维树状数组,绝对具体)

Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 20599   Accepted: 7673 Description Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the i-th row and j-th column. Initially we have A[i, j] = 0 (1

HDU 5465 Clarke and puzzle Nim游戏+二维树状数组

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5465 Clarke and puzzle Accepts: 42 Submissions: 269 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) 问题描述 克拉克是一名人格分裂患者.某一天,有两个克拉克(aa和bb)在玩一个方格游戏. 这个方格是一个n*mn∗m的矩阵,每个格子里有一