时间限制: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(矩阵分割)的更多相关文章

  1. 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 ...

  2. SGU Volume 1

    SGU 解题报告(持续更新中...Ctrl+A可看题目类型): SGU101.Domino(多米诺骨牌)------------★★★type:图 SGU102.Coprimes(互质的数) SGU1 ...

  3. 今日SGU 6.6

    sgu 177 题意:给你一个一开始全是白色的正方形,边长为n,然后问你经过几次染色之后,最后的矩形里面 还剩多少个白色的块 收获:矩形切割,我们可以这么做,离散处理,对于每次染黑的操作,看看后面有没 ...

  4. 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,:] ...

  5. Raphael Js矢量库API简介:

    Raphael Js矢量库API简介:Raphael Javascript 是一个 Javascript的矢量库. 2010年6月15日,著名的JavaScript库ExtJS与触摸屏代码库项目jQT ...

  6. Numpy Study 1

    Numpy 使用1 1.Numpy创建数组 import numpy as np 创建数组有以下方式: (1).arange numpy.arange([start, ]stop, [step, ]d ...

  7. Eigen相关介绍

    最近在用Matlab处理图像,现在要做的是将其用C++语言进行翻译,由于要进行大量的矩阵计算,就研究了一下可以进行矩阵计算的开源库,详细的介绍可以参照http://my.oschina.net/cvn ...

  8. QR码生成原理

    一.什么是QR码 QR码属于矩阵式二维码中的一个种类,由DENSO(日本电装)公司开发,由JIS和ISO将其标准化.QR码的样子其实在很多场合已经能够被看到了,我这还是贴个图展示一下: 这个图如果被正 ...

  9. Tensorflow之卷积神经网络(CNN)

    前馈神经网络的弊端 前一篇文章介绍过MNIST,是采用的前馈神经网络的结构,这种结构有一个很大的弊端,就是提供的样本必须面面俱到,否则就容易出现预测失败.如下图: 同样是在一个图片中找圆形,如果左边为 ...

随机推荐

  1. 中国版 Azure 现提供 Azure Traffic Manager

    Stephen MaloneAzure网络 - DNS和 Traffic Manager高级项目经理 我们非常高兴地宣布,中国版 Azure中现已提供 Azure Traffic Manager.Az ...

  2. C++Primer第5版学习笔记(二)

    C++Primer第5版学习笔记(二) 第三章的重难点内容         这篇笔记记录了我在学习C++常用基本语法的学习过程,基本只记录一些重难点,对概念的描述不是一开始就详尽和准确的,而是层层深入 ...

  3. swfupload 在ie9以上浏览器报错问题记录

    解决办法: swfuploadl.js line 840左右 SWFUpload.prototype.cleanUp if (typeof(movieElement[key]) === "f ...

  4. About using UTF-8 fields in MySQL

    https://www.adayinthelifeof.nl/2010/12/04/about-using-utf-8-fields-in-mysql/ I sometimes hear: “make ...

  5. 趣解curl

    Curl是Linux下一个很强大的http命令行工具,其功能十分强大. 1) 二话不说,先从这里开始吧! $ curl http://www.linuxidc.com 回车之后,www.linuxid ...

  6. PDO方法连接数据库(怕忘记,记起来)

    PDO方法连接数据库更加安全! [完整代码,只需要添上对应的数据库即可以运行] <?php include "init.inc.php"; //--------------- ...

  7. 使用jq工具在Shell命令行处理JSON数据

    由于近期要处理一些 JSON 数据格式.一大早经过一番搜索后,终于找到了 jq 这个非常棒的工具.jq 同意你直接在命令行下对 JSON 进行操作,包含分片.过滤.转换等等. 首先在mac下安装jq. ...

  8. tcpdump抓包以及port查看的一些操作

    1.tcpdump. nginx开启后会占用80端口,此时运行命令:tcpdump tcp port 80 结果例如以下: [syswj@host ~]$ sudo tcpdump tcp port ...

  9. Android自定义drawable(Shape)详解

    在Android开发过程中,经常需要改变控件的默认样式, 那么通常会使用多个图片来解决.不过这种方式可能需要多个图片,比如一个按钮,需要点击时的式样图片,默认的式样图片. 这样就容易使apk变大. 那 ...

  10. Readprocessmemory使用方法

    函数功能:该函数从指定的进程中读入内存信息,被读取的区域必须具有訪问权限. 函数原型:BOOL ReadProcessMemory(HANDLE hProcess,LPCVOID lpBaseAddr ...