博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 2155 Matrix (二维树状数组)
阅读量:6107 次
发布时间:2019-06-21

本文共 3144 字,大约阅读时间需要 10 分钟。

Matrix
Time Limit: 3000MS   Memory Limit: 65536K
Total Submissions: 17224   Accepted: 6460

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 <= i, j <= N). 
We can change the matrix in the following way. Given a rectangle whose upper-left corner is (x1, y1) and lower-right corner is (x2, y2), we change all the elements in the rectangle by using "not" operation (if it is a '0' then change it into '1' otherwise change it into '0'). To maintain the information of the matrix, you are asked to write a program to receive and execute two kinds of instructions. 
1. C x1 y1 x2 y2 (1 <= x1 <= x2 <= n, 1 <= y1 <= y2 <= n) changes the matrix by using the rectangle whose upper-left corner is (x1, y1) and lower-right corner is (x2, y2). 
2. Q x y (1 <= x, y <= n) querys A[x, y]. 

Input

The first line of the input is an integer X (X <= 10) representing the number of test cases. The following X blocks each represents a test case. 
The first line of each block contains two numbers N and T (2 <= N <= 1000, 1 <= T <= 50000) representing the size of the matrix and the number of the instructions. The following T lines each represents an instruction having the format "Q x y" or "C x1 y1 x2 y2", which has been described above. 

Output

For each querying output one line, which has an integer representing A[x, y]. 
There is a blank line between every two continuous test cases. 

Sample Input

12 10C 2 1 2 2Q 2 2C 2 1 2 1Q 1 1C 1 1 2 1C 1 2 1 2C 1 1 2 2Q 1 1C 1 1 2 1Q 2 1

Sample Output

1001

 

很裸的题。

可以使用二维树状数组。

二维的写起来很方便,两重循环。

如果是要修改(x1,y1)  -  (x2,y2)的矩形区域。

那么可以在(x1,y1) 出加1,在(x2+1,y1)处加1,在(x1,y2+1)处加1,在(x2+1,y2+1)处加1 。。

 

画个图就知道了,查询单点就是求和。

1 /* *********************************************** 2 Author        :kuangbin 3 Created Time  :2014/5/23 22:34:04 4 File Name     :E:\2014ACM\专题学习\数据结构\二维树状数组\POJ2155.cpp 5 ************************************************ */ 6  7 #include 
8 #include
9 #include
10 #include
11 #include
12 #include
13 #include
14 #include
15 #include
16 #include
17 #include
18 #include
19 using namespace std;20 const int MAXN = 1010;21 int lowbit(int x)22 {23 return x&(-x);24 }25 int c[MAXN][MAXN];26 int n;27 int sum(int x,int y)28 {29 int ret = 0;30 for(int i = x;i > 0;i -= lowbit(i))31 for(int j = y;j > 0;j -= lowbit(j))32 ret += c[i][j];33 return ret;34 }35 void add(int x,int y,int val)36 {37 for(int i = x;i <= n;i += lowbit(i))38 for(int j = y;j <= n;j += lowbit(j))39 c[i][j] += val;40 }41 42 int main()43 {44 //freopen("in.txt","r",stdin);45 //freopen("out.txt","w",stdout);46 int T;47 scanf("%d",&T);48 while(T--)49 {50 int q;51 scanf("%d%d",&n,&q);52 memset(c,0,sizeof(c));53 char op[10];54 int x1,y1,x2,y2;55 while(q--)56 {57 scanf("%s",op);58 if(op[0] == 'C')59 {60 scanf("%d%d%d%d",&x1,&y1,&x2,&y2);61 add(x1,y1,1);62 add(x2+1,y1,1);63 add(x1,y2+1,1);64 add(x2+1,y2+1,1);65 }66 else67 {68 scanf("%d%d",&x1,&y1);69 if(sum(x1,y1)%2 == 0)printf("0\n");70 else printf("1\n");71 }72 }73 if(T > 0)printf("\n");74 }75 return 0;76 }

 

 

 

 

 

 

 

 

 

 

 

 

 

转载地址:http://hrhza.baihongyu.com/

你可能感兴趣的文章
如何向 Linux 内核上游提交 Patch ?
查看>>
Go编程笔记(7)
查看>>
Go语言int类型绑定方法
查看>>
pid控制的文章
查看>>
MySQL中EXPLAIN命令详解
查看>>
redis 单点部署
查看>>
Java中需要编码的场景
查看>>
PHP生成word的三种方式
查看>>
设计模式(九)——桥接模式
查看>>
xen 创建本地存储
查看>>
TCP三次握手/四次挥手 | NAT介绍 |OSI与TCP/IP模型
查看>>
jQuery UI dialog 的使用
查看>>
ABP实战--集成Ladp/AD认证
查看>>
存储过程
查看>>
phpcms v9栏目列表调用每一篇文章内容方法
查看>>
python 自定义信号处理器
查看>>
Object-c学习之路九(字典(NSDictionary&NSMutableDictionary))
查看>>
我只是轻奢 40万内入门豪车最高让利7万!-搜狐汽车
查看>>
曲演杂坛--隐式转换
查看>>
远程桌面连接技巧--与主机拷贝文本及拷贝文件(转)
查看>>