POJ 2155 Matrix 二维树状数组
2016-12-19 20:27
435 查看
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 25586 Accepted: 9470 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 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
显然 对A[i][j]只需要记录下被改变了多少次即可直到答案
bit.add(x1,y1,1)表示将(x1,y1)右下角所有数改变一次
再把(x1,y2+1),(x2+1,y2),(x2+1,y2+1)右下角部分抵消掉即可
#include<iostream> #include<stdlib.h> #include<stdio.h> #include<string> #include<vector> #include<deque> #include<queue> #include<algorithm> #include<set> #include<map> #include<stack> #include<time.h> #include<math.h> #include<list> #include<cstring> #include<fstream> //#include<memory.h> using namespace std; #define ll long long #define ull unsigned long long #define pii pair<int,int> #define INF 1000000007 #define pll pair<ll,ll> #define pid pair<int,double> const int N = 1000+5; struct BIT{ int n; int c ; void add(int x,int y,int num){ for(int i=x;i<=n;i+=i&(-i)){ for(int j=y;j<=n;j+=j&(-j)){ c[i][j]+=num; } } } int sum(int x,int y){ int ans=0; for(int i=x;i;i-=i&(-i)){ for(int j=y;j;j-=j&(-j)){ ans+=c[i][j]; } } return ans; } void resize(int n){ this->n=n; for(int i=1;i<=n;++i){ fill(c[i],c[i]+n+1,0); } } }bit; void operC(int x1,int y1,int x2,int y2){ bit.add(x1,y1,1); bit.add(x1,y2+1,-1); bit.add(x2+1,y1,-1); bit.add(x2+1,y2+1,1);//此处被+1 再2次被-1 加1补回0 } inline int operQ(int x,int y){ return bit.sum(x,y); } int main() { //freopen("/home/lu/文档/r.txt","r",stdin); //freopen("/home/lu/文档/w.txt","w",stdout); int X,n,t; char ch; int x1,x2,y1,y2; scanf("%d",&X); while(X--){ scanf("%d%d",&n,&t); bit.resize(n); while(t--){ scanf(" %c",&ch); if(ch=='C'){ scanf("%d%d%d%d",&x1,&y1,&x2,&y2); operC(x1,y1,x2,y2); } else{ scanf("%d%d",&x1,&y1); printf("%d\n",operQ(x1,y1)&1); } } if(X!=0){ putchar('\n'); } } return 0; }
相关文章推荐
- C#数据结构之顺序表(SeqList)实例详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 数据结构之Treap详解
- 用C语言举例讲解数据结构中的算法复杂度结与顺序表
- C#数据结构之堆栈(Stack)实例详解
- C#数据结构之双向链表(DbLinkList)实例详解
- JavaScript数据结构和算法之图和图算法
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- Java数据结构及算法实例:插入排序 Insertion Sort
- Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture
- java数据结构之java实现栈
- java数据结构之实现双向链表的示例
- Java数据结构及算法实例:选择排序 Selection Sort
- Java数据结构及算法实例:朴素字符匹配 Brute Force
- Java数据结构及算法实例:汉诺塔问题 Hanoi
- Java数据结构及算法实例:快速计算二进制数中1的个数(Fast Bit Counting)