SGU 177.Square(矩阵分割)
时间限制:1.25s
空间限制:6M
题意:
给出n*n的矩阵(n<=1000),和m次涂色(m<=5000),每次涂色将一个子矩阵涂成白色或黑色,后涂的颜色将覆盖掉前面的颜色。初始所有格子颜色为白色,求m次涂色后,矩阵中白色格子的数目。
Solution:
矩阵分割,在这道题里,只需要按照从后往前分割黑色的块,记录并累计每次分割后剩下的大小
最后用矩阵格子的总数目减去黑色块的大小就可以得到白色格子的数目
因此,在这道题我们只需要记录m次涂色的块,空间复杂度O(m)
对于随机数据的时间复杂度为O(m*n)
这题也可以用二维线段树做
code
/*
矩阵分割
*/
#include <iostream>
#include <cstdio>
using namespace std;
int Gx[5009][2], Gy[5009][2];
int color[5009];
int n, m, sum;
char c; void make (int p, int x1, int x2, int y1, int y2) {
while (p<= m && (x1 > Gx[p][1] || x2 < Gx[p][0] || y1 > Gy[p][1] || y2 < Gy[p][0]))
p++;
if (p == m + 1) {
sum += (x2 - x1+1) * (y2 - y1+1);
return ;
}
int k1 = max (x1, Gx[p][0]);
int k2 = min (x2, Gx[p][1]);
if (x1 < k1)
make (p + 1, x1, k1-1, y1, y2);
if (x2 > k2)
make (p + 1, k2+1, x2, y1, y2);
x1 = k1, x2 = k2; k1 = max (y1, Gy[p][0]);
k2 = min (y2, Gy[p][1]);
if (y1 < k1)
make (p + 1, x1, x2, y1, k1-1);
if (y2 > k2)
make (p + 1, x1, x2, k2+1, y2);
}
int main() {
int x, y, x2, y2;
scanf ("%d %d", &n, &m);
for (int i = 1; i <= m; i++) {
scanf ("%d %d %d %d %c", &x, &y, &x2, &y2, &c);
Gx[i][0] = min (x, x2), Gy[i][0] = min (y, y2);
Gx[i][1] = max (x, x2), Gy[i][1] = max (y, y2);
color[i] = (c == 'b' ? 1 : 0);
}
for (int i = m; i > 0; i--) {
if (color[i] == 1)
make (i + 1, Gx[i][0], Gx[i][1], Gy[i][0], Gy[i][1]);
}
printf ("%d", n*n-sum);
return 0;
}
SGU 177.Square(矩阵分割)的更多相关文章
- 221. Maximal Square -- 矩阵中1组成的最大正方形
Given a 2D binary matrix filled with 0's and 1's, find the largest square containing only 1's and re ...
- SGU Volume 1
SGU 解题报告(持续更新中...Ctrl+A可看题目类型): SGU101.Domino(多米诺骨牌)------------★★★type:图 SGU102.Coprimes(互质的数) SGU1 ...
- 今日SGU 6.6
sgu 177 题意:给你一个一开始全是白色的正方形,边长为n,然后问你经过几次染色之后,最后的矩形里面 还剩多少个白色的块 收获:矩形切割,我们可以这么做,离散处理,对于每次染黑的操作,看看后面有没 ...
- NUMPY的学习之路(2)——索引,合并,分割,赋值
一.索引 1.1numpy数组的转置 A=np.arange(3,15).reshape(3,4) print(A) print(A[2][0]) print(A[2,1]) print(A[2,:] ...
- Raphael Js矢量库API简介:
Raphael Js矢量库API简介:Raphael Javascript 是一个 Javascript的矢量库. 2010年6月15日,著名的JavaScript库ExtJS与触摸屏代码库项目jQT ...
- Numpy Study 1
Numpy 使用1 1.Numpy创建数组 import numpy as np 创建数组有以下方式: (1).arange numpy.arange([start, ]stop, [step, ]d ...
- Eigen相关介绍
最近在用Matlab处理图像,现在要做的是将其用C++语言进行翻译,由于要进行大量的矩阵计算,就研究了一下可以进行矩阵计算的开源库,详细的介绍可以参照http://my.oschina.net/cvn ...
- QR码生成原理
一.什么是QR码 QR码属于矩阵式二维码中的一个种类,由DENSO(日本电装)公司开发,由JIS和ISO将其标准化.QR码的样子其实在很多场合已经能够被看到了,我这还是贴个图展示一下: 这个图如果被正 ...
- Tensorflow之卷积神经网络(CNN)
前馈神经网络的弊端 前一篇文章介绍过MNIST,是采用的前馈神经网络的结构,这种结构有一个很大的弊端,就是提供的样本必须面面俱到,否则就容易出现预测失败.如下图: 同样是在一个图片中找圆形,如果左边为 ...
随机推荐
- Hibernate(八)一对多单向关联映射
上次的博文Hibernate从入门到精通(七)多对一单向关联映射我们主要讲解了一下多对一单向关联映射, 这次我们继续讲解一下一对多单向映射. 一对多单向关联映射 在讲解一对多单向关联之前,按 照我们的 ...
- 适配器模式 java
结构模式:将类和对象结合在一起构成更大的结构,就像是搭积木. 1.适配器模式 源接口---适配器--目标接口 2.使用场景: 现在你有一个很古老的类,里面的一些方法很有用,你如何使用这些方法? 当然你 ...
- vim setting
django_百度搜索 最近合并代码,发现文件缩进经常不一致,请大家把以下配置放到自己主目录下.vimrc文件中. set tabstop=4 set shiftwidth=4 set e ...
- linux下swftools 的配置
1.安装所需的库和组件.机器之前安装过了,主要安装的是下面几个组件.如果不安装会提示machine `x86_64-unknown-linux' not recognized yum install ...
- Java Bean 获取properties文件的读取
实际的开发过程中,将一些配置属性从java代码中提取到properties文件中是个很好的选择,降低了代码的耦合度.下面介绍两种通过spring读取properties文件的方法,以ip地址配置为例. ...
- 终端command总结
Ctrl+Alt+Delete Ctrl+Shift+Esc Ctrl+D Alt+F4 Shift+F10 win+m Ctrl+Alt+. Ctrl+A Ctrl+S osk taskmgr cm ...
- c#基础语言编程-集合
引言 在c#常用的集合分为非泛型集合和泛型集合. 非泛型集合的类和接口位于System.Collections命名空间.这些接口和类定义各种对象(如列表.队列.位数组.哈希表和字典)的集合. 泛型集合 ...
- java中的闭包和回调
闭包(Closure)是一种能被调用的对象,它保存了创建它的作用域的信息.JAVA并不能显式地支持闭包,但是在JAVA中,闭包可以通过“接口+内部类”来实现,因为对于非静态内部类而言,它不仅记录了其外 ...
- 对vpn的认识
网上关于vpn的资料非常多,看后眼花缭乱,仍然感觉一片混沌.网上,网下參考一些资料后.试着理清一些概念问题,由于,概念理清了,找到门了,才不至于左右徘徊,一片混沌. 首先vpn,这个我们都知道叫虚拟专 ...
- android 02 登录
activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android& ...