POJ 2155 Matrix 【二维树状数组】(二维单点查询经典题)
<题目链接>
题目大意:
给出一个初始值全为0的矩阵,对其进行两个操作。
1.给出一个子矩阵的左上角和右上角坐标,这两个坐标所代表的矩阵内0变成1,1变成0。
2.查询某个坐标的点的值。
解题分析:
二维树状数组单点查询经典题。首先本题可以先从一维的情况推广,假设要使区间内[L,R]中所有的数字异或,我们应该在L处+1,并且在R+1处+1,单点查询的时候,直接查询这个点的前缀%2的值即可。因为,我们要明确,更新操作只能对[L,R]中的元素起作用,而不能影响其他区间的元素。所以,对于那些小于L的元素,由于是以前缀%2代表该点的值,所以L和R+1对这些元素没有影响,符合条件;其次,对于[L,R]中的所有元素来说,因为L+1,所以他们所有元素前缀之均进行+1操作,也符合题意;而对于那些大于R的元素来说,因为L和R+1均进行+1操作,所以对于这些元素来说,他们前缀%2的值仍然没有改变,也符合题意。所以可以知道,这种方法能够巧妙的解决区间更新和单点查询的问题。然后剩下的就是将这种思想推广到二维了,具体实现见代码。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e3+;
int n,q,tr[N][N];
inline int lowbit(int x){return x&(-x);}
void add(int x,int y,int val){
for(int i=x;i<=n;i+=lowbit(i))
for(int j=y;j<=n;j+=lowbit(j))
tr[i][j]+=val;
}
int sum(int x,int y){
int ans=;
for(int i=x;i>;i-=lowbit(i))
for(int j=y;j>;j-=lowbit(j))
ans+=tr[i][j];
return ans;
}
int main(){
int T;scanf("%d",&T);while(T--){
scanf("%d%d",&n,&q);
memset(tr,,sizeof(tr));
int x1,y1,x2,y2;
char op[];
while(q--){
scanf("%s",op);
if(op[] == 'C'){
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
add(x1,y1,); //对于矩阵中的点来说,它们点数的变化其实只需要在x1,y1处+1即可
add(x2+,y1,); //但是对矩阵外的点来说,必须要在这三个地方加+1才能对其它位置不造成干扰
add(x1,y2+,);
add(x2+,y2+,);
}else{
scanf("%d%d",&x1,&y1);
if(sum(x1,y1)% == )puts("");
else puts("");
}
}
if(T)puts("");
}
}
2018-12-11
POJ 2155 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(二维树状数组||区间修改单点查询)
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 ...
- POJ-2155 Matrix---二维树状数组+区域更新单点查询
题目链接: https://vjudge.net/problem/POJ-2155 题目大意: 给一个n*n的01矩阵,然后有两种操作(m次)C x1 y1 x2 y2是把这个小矩形内所有数字异或一遍 ...
- hdu-3584 Cube---三维树状数组+区域更新单点查询
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3584 题目大意: 给定一个N*N*N多维数据集A,其元素是0或是1.A[i,j,k]表示集合中第 i ...
- POJ 2155 Matrix(二维树状数组+区间更新单点求和)
题意:给你一个n*n的全0矩阵,每次有两个操作: C x1 y1 x2 y2:将(x1,y1)到(x2,y2)的矩阵全部值求反 Q x y:求出(x,y)位置的值 树状数组标准是求单点更新区间求和,但 ...
- HDU 4031 Attack(线段树/树状数组区间更新单点查询+暴力)
Attack Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others) Total Sub ...
- NBOJv2 1050 Just Go(线段树/树状数组区间更新单点查询)
Problem 1050: Just Go Time Limits: 3000 MS Memory Limits: 65536 KB 64-bit interger IO format: % ...
- hdu1556 树状数组区间更新单点查询板子
就是裸的区间更新: 相对于直观的线段树的区间更新,树状数组的区间更新原理不太相同:由于数组中的一个结点控制的是一块区间,当遇到更新[l,r]时,先将所有能控制到 l 的结点给更新了,这样一来就是一下子 ...
- hdu3966 树链剖分点权模板+线段树区间更新/树状数组区间更新单点查询
点权树的模板题,另外发现树状数组也是可以区间更新的.. 注意在对链进行操作时方向不要搞错 线段树版本 #include<bits/stdc++.h> using namespace std ...
- 【树状数组区间修改单点查询】HDU 4031 Attack
http://acm.hdu.edu.cn/showproblem.php?pid=4031 [题意] 有一个长为n的长城,进行q次操作,d为防护罩的冷却时间,Attack表示区间a-b的墙将在1秒后 ...
随机推荐
- swift 学习- 10 -- 类和结构体
// '类和结构体' 是人们构建代码所使用的一种通用且灵活的构造体, 我们可以使用完全相同的语法规则来为 '类和结构体' 定义属性 (变量 和 常量) 和添加方法, 从而扩展 类和结构体 的功能 // ...
- Oracle 中 nvl、nvl2、nullif、coalesce、decode 函数的用法详解
NVL(EXPR1,EXPR2) NVL2(EXPR1,EXPR2,EXPR3) NULLIF(EXPR1,EXPR2) COALESCE(EXPR1,,..,EXPRn) decode ------ ...
- Confluence 6 嵌入的 H2 数据库
为了让你的 Confluence 在安装成功后就可以使用而不需要使用任何外部的数据库,Confluence 使用一个嵌入的 H2 数据库. 当你选择对 Confluence 进行评估和测试的时候,H2 ...
- 【Windows】添加定时任务不执行
[问题]windows定时任务不执行.在“所有程序->附件->系统工具->任务计划程序”中添加了定时调用“D:\sys_task\bugmanager\run.bat”脚本的任务计划 ...
- 【python】安装hyperscan-python
环境centos6.2 1. 先安装hyperscan 主要参考http://blog.csdn.net/cheng_fangang/article/details/51143412 注意:里面2.8 ...
- BrupSuite渗透测试笔记(十)
一.Brup Repeater通常结合Proxy(历史记录),Scanner(扫描记录).Target(站点地图)等,通过其他工具上的右键执行[Send to Repeater],之后跳转到Repea ...
- 原码、补码、反码的概念和java数的存储方式
原码:用符号位和数值位表示一个带符号数,整数符号->0,负数符号->1,数值一般用二进制形式表示 [+10011]原=00010011 [-10011]原=10010011 反码:正 ...
- Centos7上vsftp脚本--> sh vsftp.sh 用户名 密码 --> sh vsftp.sh install
#!/bin/bash #vsftp install . /etc/rc.d/init.d/functions users=/etc/vsftpd/vftpuser.txt login=/etc/vs ...
- Python中字符串的截取,列表的截取
字符串的截取 Python中的字符串用单引号 ' 或双引号 " 括起来,同时使用反斜杠 \ 转义特殊字符. 字符串的截取的语法格式如下: 变量[头下标:尾下标] 索引值以 0 为开始值,-1 ...
- ajax请求数据时什么时候用GET,什么时候用POST
GET的目的就如同其名字一样是用于获取信息的.它旨在显示出页面上你要阅读的信息.浏览器会缓冲GET请求的执行结果,如果同样的GET请求再次发出,浏览器就会显示缓冲的结果而不是重新运行整个请求.重新请求 ...