POJ2155/LNSYOJ113 Matrix【二维树状数组+差分】【做题报告】
这道题是一个二维树状数组,思路十分神奇,其实还是挺水的
题目描述
给定一个N∗NN∗N的矩阵AA,其中矩阵中的元素只有0或者1,其中A[i,j]A[i,j]表示矩阵的第i行和第j列(1≤i,j≤N)(1≤i,j≤N),初始矩阵元素都是0。在矩阵上进行TT次操作,操作有以下两种:
(1)格式为C x1 y1 x2 y2(1≤x1≤x2≤n,1≤y1≤y2≤n)C x1 y1 x2 y2(1≤x1≤x2≤n,1≤y1≤y2≤n) ,其中CC为字符“C”,表示把以(x1,y1)(x1,y1)为左上角,(x2,y2)(x2,y2)为右下角的这个矩形内的每一个数字同1异或
(2)格式为Q x y(1≤x,y≤n)Q x y(1≤x,y≤n),其中QQ为字符“Q”, 表示询问A[x,y]A[x,y]的值。
输入格式
第一行输入XX,表示X组测试数据
接下来每一组测试数据第一行包含两个整数NN和TT,其中NN表示矩阵的大小,TT表示对矩阵操作次数。
接下来TT行形式如 "Q x y" or "C x1 y1 x2 y2"操作,见题目中描述
输出格式
对于每个Q x yQ x y的操作输出答案A[x,y]A[x,y]。
样例一
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
output
1
0
0
1
限制与约定
对于30%的数据N≤100,T≤3000N≤100,T≤3000
对于50%的数据N≤500,T≤20000N≤500,T≤20000
对于100%的数据N≤1000,T≤50000,X≤10N≤1000,T≤50000,X≤10
时间限制:1s1s
空间限制:256MB
首先二维树状数组的标准写法
1 #define lowbit(a) (a)&(-a)
2 void change(int px,int py,int val)
3 {
4 for(int i=px;i<=n;i+=lowbit(i))
5 for(int j=py;j<=n;j+=lowbit(j))
6 tree[i][j]+=val;
7 }
8 int ask(int px,int py)
9 {
10 int ans=0;
11 for(int i=px;i;i-=lowbit(i))
12 for(int j=py;j;j-=lowbit(j))
13 ans+=tree[i][j];
14 return ans;
15 }
就是一维树状数组加了一层循环,很好理解的233
这道题需要打个差分,差分个人理解就是把正常一个数组i与i-1做差,得到的一个差分数组,然后查询时累加前缀和,这么做有很多方便的地方,比如洛谷的树状数组2
来介绍一下差分
设数组a[]={1,6,8,5,10},那么差分数组b[]={1,5,2,-3,5}
也就是说b[i]=a[i]-a[i-1];(a[0]=0;),那么a[i]=b[1]+....+b[i];(这个很好证的)。
假如区间[2,4]都加上2的话
a数组变为a[]={1,8,10,7,10},b数组变为b={1,7,2,-3,3};
发现了没有,b数组只有b[2]和b[5]变了,因为区间[2,4]是同时加上2的,所以在区间内b[i]-b[i-1]是不变的.
所以对区间[x,y]进行修改,只用修改b[x]与b[y+1]:
b[x]=b[x]+k;b[y+1]=b[y+1]-k;
以上就是差分的应用,对于区间修改时应该想到差分,
比如这道题,就是矩阵的子矩阵修改,这种方法就非常nice
看下面这张图,修改绿色部分,只需把红色的都+1%2,再累加前缀和能满足(图片出处在水印233)
其实差分区间修改都可以理解为,比如修改(x,y)全部加2,只要把差分数组中x位置,然后再把y+1减2,就能完美解决,配上树状数组,这样修改和查询就就是O(log(n)),时间复杂度满足

注意要清数组清数组清数组清数组清数组,没清数组只A了一个点QAQ
最后放代码
1 #include<cstdio>
2 #include<algorithm>
3 #include<cstring>
4 #define lowbit(a) (a)&(-a)
5 int t,n,k,x,y,z,w;
6 int tree[1111][1111];
7 char opt[5];
8 void change(int px,int py,int val)
9 {
10 for(int i=px;i<=n;i+=lowbit(i))
11 for(int j=py;j<=n;j+=lowbit(j))
12 tree[i][j]=(tree[i][j]+val)%2;
13 }
14 int ask(int px,int py)
15 {
16 int ans=0;
17 for(int i=px;i;i-=lowbit(i))
18 for(int j=py;j;j-=lowbit(j))
19 ans=(ans+tree[i][j])%2;
20 return ans;
21 }
22 int main()
23 {
24 scanf("%d",&t);
25 while(t--)
26 {
27 memset(tree,0,sizeof(tree));
28 scanf("%d%d",&n,&k);
29 for(int i=1;i<=k;i++)
30 {
31 scanf("%s",opt);
32 if(opt[0]=='C')
33 {
34 scanf("%d%d%d%d",&x,&y,&z,&w);
35 change(x,y,1),change(z+1,w+1,1),change(x,w+1,1),change(z+1,y,1);
36 }else if(opt[0]=='Q')
37 {
38 scanf("%d%d",&x,&y);
39 printf("%d\n",ask(x,y));
40 }
41 }
42 }
43 return 0;
44 }
By 浅夜_MISAKI
转载于:https://www.cnblogs.com/Qin-Wei-Kai/p/10052168.html
POJ2155/LNSYOJ113 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 ...
- 【POJ2155】【二维树状数组】Matrix
Description Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the ...
- 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 ...
- 二维树状数组(水题) POJ1195
前段时间遇到线段树过不了,树状数组却过了的题.(其实线段树过得了的) 回忆了下树状数组. 主要原理,还是二进制位数,每一项的和表示其为它的前((最后一位1及其后)的二进制数)和,可从二进制图来看.(用 ...
- 二维树状数组+差分【p4514】上帝造题的七分钟
Description "第一分钟,X说,要有矩阵,于是便有了一个里面写满了\(0\)的\(n\times m\)矩阵. 第二分钟,L说,要能修改,于是便有了将左上角为\((a,b)\),右 ...
- poj----2155 Matrix(二维树状数组第二类)
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 16950 Accepted: 6369 Descripti ...
- poj 2155 Matrix (二维树状数组)
题意:给你一个矩阵开始全是0,然后给你两种指令,第一种:C x1,y1,x2,y2 就是将左上角为x1,y1,右下角为x2,y2,的这个矩阵内的数字全部翻转,0变1,1变0 第二种:Q x1 y1,输 ...
随机推荐
- PTA | 1020. 月饼 (25)
月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼.现给定所有种类月饼的库存量.总售价.以及市场的最大需求量,请你计算可以获得的最大收益是多少. 注意:销售时允许取出一部分库存.样 ...
- JDBCUtils,根据当前MySQL数据库下面的表生成java实体类
自己简单写的JDBCUtils,可以根据当前数据库下面的表生成java实体类,代码萌新,请多多包涵. 初始化配置: //驱动程序名//不固定,根据驱动 static String driver = & ...
- 家庭版记账本app进度之关于android界面布局的相关学习
1.线性布局(linearlayout)是一种让视图水平或垂直线性排列的布局线性布局使用<LinearLayout>标签进行配置对应代码中的类是android.widget.LinearL ...
- leetcode c++做题思路和题解(4)——队列的例题和总结
队列的例题和总结 0. 目录 栈实现队列 队列实现栈 滑动窗口最大值 1. 栈实现队列 FIFO和FILO,相当于+-号,互转都是利用"负负得正"的原理. 官方解答中第二种思路很6 ...
- 想进大厂嘛?这里有一份通关秘籍:iOS大厂面试宝典
1.NSArray与NSSet的区别? NSArray内存中存储地址连续,而NSSet不连续 NSSet效率高,内部使用hash查找:NSArray查找需要遍历 NSSet通过anyObject访问元 ...
- 津津的储蓄计划 NOIp提高组2004
这个题目当年困扰了我许久,现在来反思一下 本文为博客园ShyButHandsome的原创作品,转载请注明出处 右边有目录,方便快速浏览 题目描述 津津的零花钱一直都是自己管理.每个月的月初妈妈给津津\ ...
- 用Taro做个微信小程序Todo, 小白工作记录
微信小程序框架: Taro 做微信小程序的框架, 几个比较主流的: 官方的WePY: https://tencent.github.io/wepy/document.html#/ 美团的mpvue: ...
- L21 Momentum RMSProp等优化方法
airfoil4755 下载 链接:https://pan.baidu.com/s/1YEtNjJ0_G9eeH6A6vHXhnA 提取码:dwjq 11.6 Momentum 在 Section 1 ...
- Android内存优化—dumpsys meminfo详解
原创置顶 不死鸟JGC 最后发布于2018-12-24 14:19:28 阅读数 3960 收藏展开dumpsys 介绍Dumpsys用户系统诊断,它运行在设备上,并提供系统服务状态信息 命令格式: ...
- google无法播放mp4 chrome无法播放h264
写在前面 我在chrome上无法播放h264+Acc的mp4,在firefox.ie都可以播放,而且此mp4在vlc终可以正常播放. 视频链接:http://106.14.221.185:7001/p ...