矩阵(Matrix)
题目:矩阵(Matrix)
poj的网址:http://poj.org/problem?id=2155
poj题号:2155
时间限制: 3000MS 内存限制: 65536K
题目描述:给定N * N矩阵A,其元素为0或1.A [i,j]表示第i行和第j列中的数字。最初我们有A [i,j] = 0(1 <= i,j <= N)。 我们可以通过以下方式改变矩阵。给定一个左上角是(x1,y1)和右下角是(x2,y2)的矩形,我们使用“C”操作来改变矩形中的所有元素(如果它是一个’0’然后改变它变为’1’,否则将其更改为’0’)。为了维护矩阵的信息,您需要编写一个程序来接收和执行两种指令。
通过使用左上角为(x1,y1)和下方的矩形来改变矩阵来改变矩阵(x1,y1,x2,y2)右角是(x2,y2)。
Q xy(1 <= x,y <= n)查询A [x,y]。
输入描述:输入的第一行是表示测试用例数的整数X(X <= 10)。以下X块表示测试用例。 每个块的第一行包含两个数字N和T(2 <= N <= 1000,1 <= T <= 50000),表示矩阵的大小和指令的数量。以下的T行各自表示具有如上所述的格式“Q x y”或“C x1 y1 x2 y2”的指令。
输出描述:对于每个查询输出一行,它有一个表示A [x,y]的整数。 每两个连续测试用例之间有空白行。
样例输入:
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
样例输出:
1
0
0
1
题解:
题意就是给你个矩阵里面开始全是0,然后给你两种指令: 第一种:‘C x1,y1,x2,y2’就是将左上角为x1,y1,右下角为x2,y2,的这个矩阵内的数字全部翻转,0变1,1变0, :第二种: ‘Q x1 y1’,输出a[x1][y1]的值。
暴力自然就是每次都更新一遍矩阵里的点,最后判断输出便是。但是,我们用更好的办法去解决它。那就是二维树状数组。
怎么用呢?
我们先讨论一维情况,如下:
有一个n卡片的阵列。每个卡片倒放在桌面上。你有两个问题:
1 . T i j (反转从索引i到索引j的卡片,包括第i张和第j张卡——面朝下的卡将朝上;面朝上的卡将朝下)
2 . Q i (如果第i张卡面朝下回答0否则回答1);
解决方法:
解决问题(1和2)的方法有时间复杂度O(log n)。在数组f(长度n + 1)我们存储每个问题T(i, j)——我们设置f[i]++和f[j + 1]- -。对在i和j之间(包括i和j)每个卡k求和f[1] + f[2] + … + f[k],k将递增1,其他全部与前面的一样,结果为和取余2。(因为 如果被改了偶数次,那还是原来的0,反之如果是被改了奇数次,那就是1)
好,现在把这个想法拓展到二维上。在一维时,我们改变那两个点时就说给改变的区间定了一个范围,那么二维中我们怎么定这个范围呢?仔细想想,我们在(x1,y1 ),(x2 +1,y1 ),(x1,y2 +1), (x2 +1,y2 +1)这四个点加个一就好,(如果要求的是某个点被修改了几次的话,(x2 +1,y1 ),(x1,y2 +1)这两个点就不是加上一了,而是减去一)
查询(x,y)的时候把这个点的前缀和(所以用树状数组)求出来便是,具体代码中说。
c++代码
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
long long int c[1100][1100],cc,x1,x2,y1,y2,n,t,x,y,ans[50010],anss=0;
char ch;
long long int lowbit (long long int i)//求i用2的幂方和表示时,2的最小次幂
{return i&(-i);
}
void update(long long int x,long long int y,int value)//更新树状数组,就是给矩阵的变化定个范围
{for(int i=x;i<=n;i+=lowbit(i)){for(int j=y;j<=n;j+=lowbit(j)){c[i][j]+=value;}}
}
long long int getsum(long long int x,long long int y)//求前缀和
{long long int h=0;for(long long int i=x;i>=1;i-=lowbit(i)){for(long long int j=y;j>=1;j-=lowbit(j))h+=c[i][j];}return h;
}
int main()
{cin>>cc;//输入有几组数据 for(int l=1;l<=cc;l++){memset(c,0,sizeof(c));memset(ans,0,sizeof(ans));cin>>n>>t;//输入矩阵边长和询问的次数 for(int i=1;i<=t;i++){cin>>ch;if(ch=='C'){scanf("%lld%lld%lld%lld",&x1,&y1,&x2,&y2); update(x1,y1,1);//给四个点的值加上一,这里可能会有疑问,在刚刚的一维讲解中明明是有点要减一的啊,为啥这里不用。因为在这题中我们只需要知道的是这点被改过的次数是奇数还是偶数,它在求前缀和时加了两遍一取余2,跟加上一再加上负一取余2是没区别的(仅仅是这题可以,如果要求的是被改了多少次就不行)。 update(x1,y2+1,1);update(x2+1,y1,1);update(x2+1,y2+1,1);}else {scanf("%lld%lld",&x,&y); cout<<(getsum(x,y))%2<<endl;//输出前缀和取余2,如果被改了偶数次,那还是原来的0,反之如果是被改了奇数次,那就是1 }}cout<<endl;//这里的换行我也不知道为什么要这样,但是这里不换行在poj上就过不了啊 }return 0;
}
矩阵(Matrix)相关推荐
- python矩阵教程_numpy教程:矩阵matrix及其运算
numpy矩阵简介 NumPy函数库中存在两种不同的数据类型(矩阵matrix和数组array),都可以用于处理行列表示的数字元素.虽然它们看起来很相似,但是在这两个数据类型上执行相同的数学运算可能得 ...
- 果皇的矩阵[matrix]
#1101. 果皇的矩阵[matrix] 题目描述 输入格式 一行两个数,表示 N,M. 输出格式 一行一个数,表示答案对 10^9+7 取模后的结果 样例 样例输入 3 3 样例输出 38 数据范围 ...
- c++实现Matlab矩阵Matrix类(实矩阵Matrix、复矩阵CMatrix)
全栈工程师开发手册 (作者:栾鹏) matlab2c动态链接库下载 matlab库函数大全 matlab2c基础教程 matlab2c开发全解教程 开发注意事项: 1.目前matlab2c对矩阵的实现 ...
- [转载] numpy教程:矩阵matrix及其运算
参考链接: Python中的numpy.asmatrix http://blog.csdn.net/pipisorry/article/details/48791403 numpy矩阵简介 NumPy ...
- 矩阵宏观调度:Zigzag扫描打印矩阵matrix,图像工程的一种编码
矩阵宏观调度:Zigzag扫描打印矩阵matrix,图像工程的一种编码 提示:极其重要的矩阵处理技巧,矩阵下标的宏观调度 文章目录 矩阵宏观调度:Zigzag扫描打印矩阵matrix,图像工程的一种编 ...
- R语言使用na.omit函数删除矩阵matrix数据中的缺失值(NA值)
R语言使用na.omit函数删除矩阵matrix数据中的缺失值(NA值) 目录 R语言使用na.omit函数删除矩阵matrix数据中的缺失值(NA值) R 语言特点 R语言使用na.omit函数删除 ...
- R语言使用crossprod函数和tcrossprod函数计算矩阵matrix交叉积(Matrix Cross Product)、crossprod函数、tcrossprod函数计算矩阵和向量的交叉积
R语言使用crossprod函数和tcrossprod函数计算矩阵matrix交叉积(Matrix Cross Product).crossprod函数.tcrossprod函数计算矩阵和向量的交叉积 ...
- oracle矩阵函数,R语言矩阵matrix函数
矩阵是元素布置成二维矩形布局的R对象. 它们包含相同原子类型的元素.尽管我们可以创建只包含字符或只逻辑值的矩阵,但是它们没有多大用处.我们使用的是在数学计算中含有数字元素矩阵. 使用 matrix() ...
- python/numpy中数组array和矩阵matrix的区别
在numpy中,array(实际上是ndarray,表示多维数组)是可以有多维度的,而matrix只有两个维度,即行和列.所以matrix是array的一种特例,因而它继承了array的所有函数,同时 ...
- 【自动驾驶】Eigen:矩阵Matrix的使用
矩阵的使用可参考系列博客:https://blog.csdn.net/caomin1hao/category_7898685.html 1.Eigen::Matrix<float, 3, 4&g ...
最新文章
- 【VritualBox】虚拟机VirtualBox中ubuntu下加载USB设备报错:busy with a previous request.Plaease try again later
- C++ eof()函数陷阱
- 领域驱动设计案例:Tiny Library:领域模型
- java jmx 配置_Java JMX远程调优一点就通
- 油猴脚本使用waitForKeyElements报错eslint: no-undef - `waitForKeyElements` is not defined
- mac 使用 pf 做端口转发
- VK Cup 2012 Qualification Round 2 C. String Manipulation 1.0 线段树 or 树状数组+二分
- Markdown编辑器
- Crossin先生的微信打飞机游戏(4)
- 004-集成maven和Spring boot的profile功能打包
- CSS:个人常用按钮样式
- 用kindle看微信公众号文章的一种方法
- [buuctf] crypto全解——85-120(不建议直接抄flag)
- Visual Studio Code的九九乘法表
- 面试系列-1 大厂面试幂等性
- 在Unity中通过NGUI UITexture制作动态聊天表情
- Vi编辑文件无法保存退出的解决方法
- vim tutorial 101 hacks(一)
- Win10怎么给共享文件夹设密码
- 腾讯自研云原生数据库CynosDB发布 兼容MySQL和PostgreSQL
热门文章
- yii2 分页ajax,yii2的分页和ajax分页
- Windows远程桌面连接报错【用户账户限制会阻止你登录】
- 使用 HttpWebRequest 发送模拟 POST 请求(转载)
- 文献管理软件Mendeley的使用
- python链表合并去重_合并两个链表并去重(php实现)
- 中考使用计算机吗,中考计算机考试内容·中考信息技术要考哪些项目?
- git merge之--no-ff 的作用
- camstar portal 7全屏显示
- docker搭建vulhub
- cad面积累计lisp怎么用_求一个cad的lisp:一次计算多个封闭线框的面积,并显示每个面积和总面积...