POJ 2155 二维树状数组(插块问点)
2016-07-15 11:04
387 查看
Matrix
Time Limit: 3000MS Memory Limit: 65536K
Total Submissions: 24337 Accepted: 9013
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.
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).
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
1
2 10
C 2 1 2 2
Q 2 2
C 2 1 2 1
Q 1 1
C 1 1 2 1
C 1 2 1 2
C 1 1 2 2
Q 1 1
C 1 1 2 1
Q 2 1
Sample Output
1
0
0
1
Source
POJ Monthly,Lou Tiancheng
二维树状数组的S[i][j]就是在从0 0 到i j这个子矩阵里的的所有元素的和,这里只有 0 1 所以%2,GG
Time Limit: 3000MS Memory Limit: 65536K
Total Submissions: 24337 Accepted: 9013
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.
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).
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
1
2 10
C 2 1 2 2
Q 2 2
C 2 1 2 1
Q 1 1
C 1 1 2 1
C 1 2 1 2
C 1 1 2 2
Q 1 1
C 1 1 2 1
Q 2 1
Sample Output
1
0
0
1
Source
POJ Monthly,Lou Tiancheng
二维树状数组的S[i][j]就是在从0 0 到i j这个子矩阵里的的所有元素的和,这里只有 0 1 所以%2,GG
#include<cstdio> #include<cstring> #include<iostream> using namespace std; const int N=1005; int n; int c ; int lowbit(int x) //求最低位1的位置所表示的数 { return x&(-x); } void update(int i,int j,int num)// 单点更新c[i][j] 加上num, { for(int x=i;x<=n;x+=lowbit(x)) for(int y=j;y<=n;y+=lowbit(y)) c[x][y]=(c[x][y]+num)%2; } int S(int i,int j) //求c[i][j]的矩阵和 { int sum=0; for(int x=i;x>0;x-=lowbit(x)) for(int y=j;y>0;y-=lowbit(y)) sum=(sum+c[x][y])%2; return sum; } int main(){ int T,t; char s[2]; int x1,y1,x2,y2; scanf("%d",&T); while(T--){ scanf("%d%d",&n,&t); memset(c,0,sizeof(c)); while(t--){ scanf("%s",s); if(s[0]=='C'){ scanf("%d%d%d%d",&x1,&y1,&x2,&y2); update(x1,y1,1);//这里是重点,画图就可以明白了 update(x2+1,y2+1,1);//... update(x1,y2+1,1);//.... update(x2+1,y1,1);//... } else { scanf("%d%d",&x1,&y1); printf("%d\n",S(x1,y1)); } } if(T)printf("\n"); } return 0; }
相关文章推荐
- .Net基本语法学习(2)
- JavaSE学习笔记之-----面向对象
- 开始我的Python之旅(二)
- 中国的残疾人都到哪里去了?
- 杭电ACM 1000
- 对死锁的探究
- mac 上svn服务器地址变更解决方法
- 从数组中移除重复的小质数
- 最小生成树算法
- 记一次修改linux系统语言
- java+myeclipse 编程日志
- js入门必读--和你分享js的学习之路1
- 看医疗行业如何建立信息化战略决策
- JAVA-Eclipse中web-inf和meta-inf文件夹
- 横向浅谈移动技术------( 原生,混合,web --- 谁能问鼎移动开发的明天)
- iOS完整App资源收集
- Android Intent Activity 跳转几种情况所使用的不同方法
- [Leetcode] Container With Most Water 能装最大水的容量
- java 单利模式
- redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool