POJ2155 Matrix 【二维树状数组】+【段更新点查询】
Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 17766 | Accepted: 6674 |
Description
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 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
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
题意:对一个给定size且初始化为0的矩阵。运行一些命令,Q A B为查看arr[a][b]元素的值,C X1 Y1 X2 Y2为将(x1, y1) (x2, y2)矩形范围内的全部点0、1翻转。
题解:树状数组模式二的使用方法。段更新,点查询。update(x2, y2)表示从(1, 1)到(x2, y2)范围内的全部点都要翻转一次,可是这样会把给定范围外的一些点也翻转到,因此须要将这些点翻转回去。
- #include <stdio.h>
- #include <string.h>
- #define maxn 1002
- int size, tree[maxn][maxn];
- int lowBit(int x){ return x & (-x); }
- //向下更新表示A[1]...A[i]每一个元素都要 += val,推广到二维同理
- void update(int x, int y, int val)
- {
- int temp;
- while(x > 0){
- temp = y;
- while(temp > 0){
- tree[x][temp] += val;
- temp -= lowBit(temp);
- }
- x -= lowBit(x);
- }
- }
- int query(int x, int y)
- {
- int sum = 0, temp;
- while(x <= size){
- temp = y;
- while(temp <= size){
- sum += tree[x][temp];
- temp += lowBit(temp);
- }
- x += lowBit(x);
- }
- return sum;
- }
- int main()
- {
- //freopen("stdin.txt", "r", stdin);
- int cas, q, a, b, c, d;
- char com[2];
- scanf("%d", &cas);
- while(cas--){
- scanf("%d%d", &size, &q);
- memset(tree, 0, sizeof(tree));
- while(q--){
- scanf("%s%d%d", com, &a, &b);
- if(com[0] == 'C'){
- scanf("%d%d", &c, &d);
- update(c, b - 1, -1);
- update(a - 1, d, -1);
- update(a - 1, b - 1, 1);
- update(c, d, 1);
- }else printf("%d\n", query(a, b) & 1);
- }
- if(cas) printf("\n");
- }
- return 0;
- }
POJ2155 Matrix 【二维树状数组】+【段更新点查询】的更多相关文章
- 【poj2155】Matrix(二维树状数组区间更新+单点查询)
Description Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the ...
- [poj2155]Matrix(二维树状数组)
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 25004 Accepted: 9261 Descripti ...
- poj----2155 Matrix(二维树状数组第二类)
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 16950 Accepted: 6369 Descripti ...
- POJ2155:Matrix(二维树状数组,经典)
Description Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the ...
- 牛客网 暑期ACM多校训练营(第二场)J.farm-STL(vector)+二维树状数组区间更新、单点查询 or 大暴力?
开心.jpg J.farm 先解释一下题意,题意就是一个n*m的矩形区域,每个点代表一个植物,然后不同的植物对应不同的适合的肥料k,如果植物被撒上不适合的肥料就会死掉.然后题目将每个点适合的肥料种类( ...
- hdu 2642二维树状数组 单点更新区间查询 模板题
二维树状数组 单点更新区间查询 模板 从零开始借鉴http://www.2cto.com/kf/201307/227488.html #include<stdio.h> #include& ...
- POJ2155 Matrix(二维树状数组||区间修改单点查询)
Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the i-th row an ...
- poj2155一个二维树状数组
...
- POJ 2155 Matrix(二维树状数组,绝对具体)
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 20599 Accepted: 7673 Descripti ...
- POJ 2155:Matrix 二维树状数组
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 21757 Accepted: 8141 Descripti ...
随机推荐
- js 删除数组中某一项的几种方法总结
第一种:改变原数组 借用原生数组方法:splice(index,len,[item]) 剪接 借用原生对象方法:delete array[index] + array.slice(0, index) ...
- jsencrypt加解密 &&cryptico
npm install --save jsencrypt import {JSEncrypt} from 'jsencrypt'; //导入公钥if ( publicKey.indexOf('---- ...
- js 发送短信验证码倒计时
html <input type="button" id="btn" value="免费获取验证码" onclick="se ...
- 导入.sql文件入数据库
1.创建数据库,例如abc create database abc; 2.进入数据库 use abc 3.导入e盘下的ssh.sql文件即可 source e:\ssh.sql; 截图如下:
- h5移动端常见虚拟键盘顶起底部导航栏解决办法
在h5移动端开发中相信很多朋友跟我一样都会遇到页面底部导航被虚拟键盘顶起的问题,自己在网上找到的解决办法拿出来与大家分享,有不完美之处还望见谅,有更好的解决办法可以贴出来大家一起互相学习!! var ...
- 【牛客小白月赛6】 J 洋灰三角 - 快速幂&逆元&数学
题目地址:https://www.nowcoder.com/acm/contest/136/J 解法一: 推数学公式求前n项和: 当k=1时,即为等差数列,Sn = n+pn(n−1)/2 当k≠1时 ...
- 对拍 bat命令快速模板
对拍.bat @echo off :loop maker.exe > in.in wq.exe < in.in > out.out std.exe < in.in >st ...
- 树形查询SQL优化一例
上周五一哥们发了条SQL,让我看看,代码如下: SELECT COUNT(1) FROM (select m.sheet_id from cpm_main_sheet_history m, cpm_s ...
- ORM之连表操作
ORM之连表操作 -----------------------------连表的正向操作------------------------- 在models.py中创建两张表UserType和User ...
- 第二十二节:scrapy爬虫识别验证码(一)类库安装
一.安装tesserocr 1.首先下载tesseract:https://digi.bib.uni-mannheim.de/tesseract/ ,我下载的是tesseract-ocr-setup- ...