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,是采用的前馈神经网络的结构,这种结构有一个很大的弊端,就是提供的样本必须面面俱到,否则就容易出现预测失败.如下图: 同样是在一个图片中找圆形,如果左边为 ...
随机推荐
- 【转】Android--多线程之Handler--不错
原文网址:http://www.cnblogs.com/plokmju/p/android_handler.html 前言 Android的消息传递机制是另外一种形式的“事件处理”,这种机制主要是为了 ...
- winphone 开发学习笔记(2)
导航 NavigationService.Navigate(new Uri("xxxx.xaml",UriKind.Relative)) xxx表示要跳转的目标页面 页面和页面导航 ...
- JavaScript高级程序设计20.pdf
用户代理检测 为了不在全局作用域中添加多余的变量,我们使用模块增强模式来封装检测脚本 以下是完整的用户代理字符串检测脚本,包括检测呈现引擎.平台.Window操作系统.移动设备和游戏系统 var cl ...
- Debug调试
1.F5单步调试进入函数内部 2.F6单步调试进行下一步 3.F7由函数内部返回到调用用处 4.F8一直执行到下一个断点
- RabbitMQ 概念
RabbitMQ快速概念入门 转(http://blog.csdn.net/qq_16414307/article/details/50585630) 本文适有一定消息队列基础的,但没有接触过Ra ...
- Java 23种设计模式详尽分析与实例解析之二--结构型模式
Java设计模式 结构型模式 适配器模式 模式动机:在软件开发中采用类似于电源适配器的设计和编码技巧被称为适配器模式.通常情况下,客户端可以通过目标类的接口访问它所提供的服务.又是,现有的类可以满足客 ...
- 使用WinINet和WinHTTP实现Http訪问
使用WinINet和WinHTTP实现Http訪问 飘飘白云 l_zhaohui@163.com 2007-11-30 Http訪问有两种方式,GET和POST,就编程来说GET方式相对简单点,它不用 ...
- 基于hadoop2.6.0搭建5个节点的分布式集群
1.前言 我们使用hadoop2.6.0版本配置Hadoop集群,同时配置NameNode+HA.ResourceManager+HA,并使用zookeeper来管理Hadoop集群 2.规划 1.主 ...
- Excel VBA批量修改文件夹下的文件名
今天,有同事提出想批量修改文件名,规则比较简单,在第五位后加“-”即可, 上网没找到相关工具,就自己做了个excel,用宏代码修改. 代码如下: Private Sub CommandButton1_ ...
- iOS-UITouch,UIEvent使用介绍
UITouch 当用户用一根手指触摸屏幕时,会创建一个与手指相关联的UITouch对象 一根手指对应一个UITouch对象 UITouch的作用 保存着跟手指相关的信息,比如触摸的位置.时间.阶段 当 ...