UVA1493 - Draw a Mess(并查集)

UVA1493 - Draw a Mess(并查集)

题目链接

题目大意:一个N * M 的矩阵,每次你在上面将某个范围上色,不论上面有什么颜色都会被最新的颜色覆盖,颜色是1-9,初始的颜色是0.最后输出这个矩形中。每一个颜色有多少个。某个范围这个分为了四种,圆,矩形,菱形,还有正三角形(倒着的)。注意这题的边界,不能超出这个矩形,非常easy越界。

解题思路:由于题的矩阵范围是200 * 50000,然后操作又是50000,这样三个相乘,即使给60s也是不够的。由于行的数目比較少。假设每次都能将这一行哪个没处理过直接拿出来。而不用一个一个推断就快非常多了,这样一来就相当于每一个格子仅仅要遍历一次。所以这里就每行用一个并查集。标记这这个位置以及后面的位置能够上色的起始位置。

然后颜色更新问题仅仅要将操作反着过来上色就能够处理了。

代码:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>using namespace std;
const int M = 50005;
const int N = 205;int f[N][M];
int G[N][M];
int color[10];
int n, m, q;
char str[N];struct OP {char type;int x, y, l, r, c;
}op[M];int getParent (int x, int y) { return y == f[x][y] ?

y : f[x][y] = getParent (x, f[x][y]); } void init() { for (int i = q - 1; i >= 0; i--) { scanf ("%s", str); if (str[0] == 'D') scanf ("%d%d%d%d", &op[i].x, &op[i].y, &op[i].l, &op[i].c); else if (str[0] == 'T') scanf ("%d%d%d%d", &op[i].x, &op[i].y, &op[i].l, &op[i].c); else if (str[0] == 'R') scanf ("%d%d%d%d%d", &op[i].x, &op[i].y, &op[i].l, &op[i].r, &op[i].c); else scanf ("%d%d%d%d", &op[i].x, &op[i].y, &op[i].l, &op[i].c); op[i].type = str[0]; } for (int i = 0; i <= n; i++) for (int j = 0; j <= m; j++) f[i][j] = j; memset (color, 0, sizeof (color)); } void circle (int x, int y, int r, int c) { int L, R, s; for (int i = -r; i <= r; i++) { s = sqrt(r * r - i * i); if (i + x >= n || i + x < 0) continue; L = max(y - s, 0); L = max (getParent (i + x, L), L); R = min (s + y, m - 1); for (int j = L; j <= R; j++) { if (j == getParent (i + x, j)) { color[c]++; f[i + x][j] = R + 1; } else j = getParent(i + x, j) - 1; } } } void diamond (int x, int y, int r, int c) { int L, R; for (int i = -r; i <= r; i++) { if (i + x >= n || i + x < 0) continue; R = min (r - abs(i) + y, m - 1); L = max (abs(i) - r + y, 0); L = max (L, getParent (i + x, L)); for (int j = L; j <= R; j++) { if (j == getParent (i + x, j)) { color[c]++; f[i + x][j] = R + 1; } else j = getParent (i + x, j) - 1; } } } void rectangle (int x, int y, int l, int w, int c) { int L, R; for (int i = x; i < min(x + l, n); i++) { L = max (y, getParent (i, y)); R = min (y + w - 1, m - 1); for (int j = L; j <= R; j++) { if (j == getParent (i, j)) { color[c]++; f[i][j] = R + 1; } else j = getParent (i, j) - 1; } } } void triangle (int x, int y, int w, int c) { int L, R, h; h = (w + 1) / 2; for (int i = 0; i < h; i++) { if (i + x >= n) break; L = max (y - h + i + 1, 0); L = max (getParent(i + x, L), L); R = min (y + h - i - 1, m - 1); for (int j = L; j <= R; j++) { if (j == getParent (i + x, j)) { color[c]++; f[i + x][j] = R + 1; } else j = getParent (i + x, j) - 1; } } } void solve () { for (int i = 0; i < q; i++) { if (op[i].type == 'D') diamond (op[i].x, op[i].y, op[i].l, op[i].c); else if (op[i].type == 'C') circle (op[i].x , op[i].y, op[i].l, op[i].c); else if (op[i].type == 'T') triangle (op[i].x, op[i].y, op[i].l, op[i].c); else rectangle (op[i].x, op[i].y, op[i].l, op[i].r, op[i].c); } } int main () { char str[N]; while (scanf ("%d%d%d", &n, &m, &q) != EOF) { init (); solve(); for (int i = 1; i < 9; i++) printf ("%d ", color[i]); printf ("%d\n", color[9]); } return 0; }

转载于:https://www.cnblogs.com/mfrbuaa/p/5381511.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/255561.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hyper-v Server 2012 Release Candidate 部署体验

很多人知道&#xff0c;Microsoft Hyper-V分为两种类型&#xff1a;一种是作为Windows Server的一个组件&#xff0c;另一种是作为虚拟化产品的单独服务器。虽然两者都是技术上的Hyper-V&#xff0c;每个版本的特性和用例各不相同。 Hyper-V Server直接在物理机器硬件上运行&am…

Unity 读取资源(图片)

方法一&#xff1a; 采用Resource.Load方法读取&#xff0c;读取在Unity中Assets下Resources目录下的资源名&#xff08;不采用后缀&#xff09;。 //图片放在Asset/Resources/ Texture2D tex (Texture2D)Resources.Load("图片名称"); 方法二&#xff1a; 采用WWW类…

【Python3 SelectKBest 调用personer出现的错误】

初始 相关系数过滤法调用函数 from sklearn.feature_selection import SelectKBest from scipy.stats import pearsonr SelectKBest(lambda X,Y:np.array(map(lambda x:pearsonr(x,Y),X.T)).T,k2) .fit_transform(X_test,y_test) TypeError: float() argument must be a strin…

ABB机器人的错误处理

ABB机器人的错误处理 errnum 数据类型 errnum用于描述在执行过程中&#xff0c;发生的所有可恢复的错误。例如程序执行时&#xff0c;被零除。 如果机器人程序执行过程中检测到一个错误&#xff0c;错误非致命&#xff0c;可以被错误处理程序处理。 这类错误的典型例子是…

面向对象的七大原则

总脉络图&#xff1a; 一&#xff1a;单一职责原则(全称&#xff1a;“Single-Responsibility Principle”)又称 单一功能原则 核心&#xff1a;解耦和增强内聚性&#xff08;高内聚&#xff0c;低耦合&#xff09; 说明&#xff1a; 就一个类而言&#xff0c;应该只专注于做一…

福建工程学院寒假作业G题

涨姿势题就是所谓的优化题&#xff0c;在组队赛中&#xff0c;队伍发现了一题水题&#xff0c;那么应该交给谁去处理&#xff1f;作为处理水题的代码手&#xff0c;应该具备什么样的素养&#xff1f;1&#xff0c;要快&#xff0c;水题拼的就是速度&#xff01;2&#xff0c;不…

excel 多列匹配相等后 引用值

2019独角兽企业重金招聘Python工程师标准>>> 场景 如图下&#xff0c;当A、B列与E、F列皮配上&#xff0c;C列则引用G列的值 原理 VLOOKUP只能查找单列值。我们可以把多列值拼接后形成一个虚拟列&#xff0c;然后VLOOKUP函数查找这个虚拟列进行匹配。 在C1处输入下…

【BUG调试】——OSError: Caught OSError in DataLoader worker process 0

目录 问题描述&#xff1a; 参考链接 问题分析 解决方案 出现情况 问题描述&#xff1a; 在使用pytorch搭建了VGG从头开始训练时出现了以下问题&#xff1a; OSError: Caught OSError in DataLoader worker process 0 参考链接 参考up主视频&#xff1a;4.2 使用pytor…

cvAdd()和 cvAddS()函数的使用

函数原型如下&#xff1a; voidcvAdd( const CvArr* src1, const CvArr* src2, CvArr* dst, const CvArr* maskNULL ); src1 第一个原数组 src2 第二个原数组 dst 输出数组 mask 操作的复盖面, 8-bit单通道数组; 只有复盖面指定的输出数组被修改。 函数 cvAdd 加一个数…

设计模式之接口隔离原则

这个原则想必大家从字面就可以猜出大体的含义&#xff0c;其实这个原则可以说是依赖倒置原则的一种进化补充&#xff0c;因为依赖倒置原则告诉我们实现类的各种依赖关系应该尽量隔离在抽象里面&#xff0c;同时底层的接口协议不应该依赖上层协议的变更而变更&#xff0c;所以我…

iOS 图解多线程

转载于:https://www.cnblogs.com/OnNineMonkey/p/5385963.html

Egret之位图字体

1 , 关于位图字体的制作 2 , egret官方提供的资源 看看cartoon-font.fnt的内容 {"file":"cartoon-font.png","frames":{ "A":{"x":1,"y":54,"w":21,"h":24,"offX":2,"offY&qu…

【机器视觉】——平面测量实际尺寸(像素尺寸转物理尺寸)

目录 方法一:比例尺法 方法:二:三角法 方法三:相机标定 以下方法均在平面的前提下进行 方法一:比例尺法 在一张纸上绘制一个带刻度的直线,将纸张放在摄像头下,抓取任意两点的像素坐标,计算像素距离pd,再根据刻度读取实际距离ad,根据两者可以求出缩放比例,即地图上…

图像处理基本算法-滤波

线性滤波器的向量表示&#xff1a; W是一个大小为m*n的滤波器的系数&#xff0c;Z为由滤波器覆盖的相应图像的灰度值。 线性滤波器所能是实现的就是乘积求和操作。 几种常见的滤波器&#xff1a; 平滑空间滤波器如均值滤波 统计排序滤波器如中值滤波 锐化空间滤波器如锐化…

20145122《Java面向对象程序设计》实验二实验报告

实验名称&#xff1a; Java面向对象程序设计 实验内容&#xff1a; 初步掌握单元测试和TDD理解并掌握面向对象三要素&#xff1a;封装、继承、多态初步掌握UML建模熟悉S.O.L.I.D原则了解设计模式 PSP时间 步骤耗时百分比需求分析1h12.5%设计1h12.5%代码实现3h37.5%测试1h12.5%分…

iOS中AutoLayer自动布局流程及相关方法

关于UIView的Layer&#xff0c;IOS提供了三个方法&#xff1a; 1、layoutSubviews 系统重写布局:在iOS5.1和之前的版本&#xff0c;此方法的缺省实现不会做任何事情(实现为空)&#xff0c;iOS5.1之后(iOS6开始)的版本&#xff0c;此方法的缺省实现是使用你设置在此view上面的co…

移动开发web第一天

一、适配问题解决方案&#xff1a;流式布局 viewport1、流式布局百分比布局&#xff0c;通过设置盒子的宽度为百分比来根据屏幕的大小进行伸缩&#xff0c;特点是不受固定像素的限制&#xff0c;内容向两侧填充2、viewport在移动端用来承载网页的这个区域&#xff0c;就是我们…

均值滤波 中值滤波 高斯平滑滤波

均值滤波是典型的线性滤波算法&#xff0c;它是指在图像上对目标像素给一个模板&#xff0c;该模板包括了其周围的临近像素&#xff08;以目标象素为中心的周围8个像素&#xff0c;构成一个滤波模板&#xff0c;即去掉目标像素本身&#xff09;&#xff0c;再用模板中的全体像素…

javaWeb开发总结 ---- 前端数据插入到后台

一&#xff0c;概述&#xff1a; 本文主要描述如何将数据通过表单提交到后台并插入到数据库&#xff0e;其中后台使用spring框架&#xff0e; 二&#xff0c;开发流程&#xff1a; 明确需求&#xff0c;即将什么数据插入到数据库平台搭建&#xff0c;配置spring, 数据库&#…