uva 1493 - Draw a Mess(并查集)
题目大意:给定一个矩形范围,有四种上色方式,后面上色回将前面的颜色覆盖,最后问9种颜色各占多少的区域。
解题思路:用并查集维护每一个位置相应下一个能够上色的位置。然后将上色倒转过来处理,就攻克了颜色覆盖的问题。
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxr = 205;
const int maxc = 50005;
int N, M, Q, cnt[15];
int f[maxr][maxc];
struct Order {
int sign, star, end;
int x, y, r, w, c;
void set (int sign, int x, int y, int c, int r, int w = 0) {
this->sign = sign;
this->x = x;
this->y = y;
this->c = c;
this->r = r;
this->w = w;
del_star();
}
void del_star () {
if (sign < 2) {
star = max(x - r, 0);
end = min(x + r, N - 1);
} else if (sign == 2) {
r = (r + 1) / 2 - 1;
star = x;
end = min(x + r, N-1);
}
}
}op[maxc];
int getfar (int* far, int x) {
return x == far[x] ? x : far[x] = getfar(far, far[x]);
}
int style (char ch) {
if (ch == 'C')
return 0;
else if (ch == 'D')
return 1;
else if (ch == 'T')
return 2;
else
return 3;
}
void init () {
memset(cnt, 0, sizeof(cnt));
for (int i = 0; i <= M; i++) {
for (int j = 0; j < N; j++)
f[j][i] = i;
}
char s[20];
int x, y, r, c, w;
for (int i = 1; i <= Q; i++) {
scanf("%s", s);
if (s[0] != 'R') {
scanf("%d%d%d%d", &x, &y, &r, &c);
op[i].set(style(s[0]), x, y, c, r);
} else {
scanf("%d%d%d%d%d", &x, &y, &r, &w, &c);
op[i].set(style(s[0]), x, y, c, r, w);
}
}
}
inline int get_R (int r, int x, int i, int sign) {
if (sign == 0)
return (int)sqrt(1.0 * r * r - 1.0 * (x - i) * (x - i));
else if (sign == 1)
return r - abs(x - i);
else if (sign == 2)
return r - (i - x);
return 0;
}
int count (int x, int y, int r, int star, int end, int sign) {
int ret = 0;
for (int i = star; i <= end; i++) {
int R = get_R(r, x, i, sign);
int mv = max(y - R, 0);
while (mv = getfar(f[i], mv), abs(mv - y) <= R && mv < M) {
ret++;
f[i][mv] = mv+1;
}
}
return ret;
}
int count_rec (int x, int y, int r, int l) {
int ret = 0;
for (int i = x; i <= x + r - 1 && i < N; i++) {
int mv = y;
while (mv = getfar(f[i], mv), abs(mv - y) < l && mv < M) {
ret++;
f[i][mv] = mv+1;
}
}
return ret;
}
void solve () {
for (int i = Q; i; i--) {
int& col = cnt[op[i].c];
if (op[i].sign == 3)
col += count_rec(op[i].x, op[i].y, op[i].r, op[i].w);
else
col += count(op[i].x, op[i].y, op[i].r, op[i].star, op[i].end, op[i].sign);
}
for (int i = 1; i <= 9; i++)
printf("%d%c", cnt[i], i == 9 ? '\n' : ' ');
}
int main () {
while (scanf("%d%d%d", &N, &M, &Q) == 3) {
init();
solve();
}
return 0;
}
uva 1493 - Draw a Mess(并查集)的更多相关文章
- UVA 1493 Draw a Mess(并查集+set)
这题我一直觉得使用了set这个大杀器就可以很快的过了,但是网上居然有更好的解法,orz... 题意:给你一个最大200行50000列的墙,初始化上面没有颜色,接着在上面可能涂四种类型的形状(填充): ...
- UVA1493 - Draw a Mess(并查集)
UVA1493 - Draw a Mess(并查集) 题目链接 题目大意:一个N * M 的矩阵,每次你在上面将某个范围上色,不论上面有什么颜色都会被最新的颜色覆盖,颜色是1-9,初始的颜色是0.最后 ...
- Draw a Mess (并查集)
It's graduated season, every students should leave something on the wall, so....they draw a lot of g ...
- UVA 572 油田连通块-并查集解决
题意:8个方向如果能够连成一块就算是一个连通块,求一共有几个连通块. 分析:网上的题解一般都是dfs,但是今天发现并查集也可以解决,为了方便我自己理解大神的模板,便尝试解这道题目,没想到过了... # ...
- UVA 12232 - Exclusive-OR(带权并查集)
UVA 12232 - Exclusive-OR 题目链接 题意:有n个数字.一開始值都不知道,每次给定一个操作,I a v表示确认a值为v,I a b v,表示确认a^b = v,Q k a1 a2 ...
- UVA 1160 - X-Plosives 即LA3644 并查集判断是否存在环
X-Plosives A secret service developed a new kind ofexplosive that attain its volatile property only ...
- UVA 11987 Almost Union-Find (并查集+删边)
开始给你n个集合,m种操作,初始集合:{1}, {2}, {3}, … , {n} 操作有三种: 1 xx1 yy1 : 合并xx1与yy1两个集合 2 xx1 yy1 :将xx1元素分离出来合到yy ...
- UVA - 1160(简单建模+并查集)
A secret service developed a new kind of explosive that attain its volatile property only when a spe ...
- UVa 1455 Kingdom 线段树 并查集
题意: 平面上有\(n\)个点,有一种操作和一种查询: \(road \, A \, B\):在\(a\),\(b\)两点之间加一条边 \(line C\):询问直线\(y=C\)经过的连通分量的个数 ...
随机推荐
- ip地址正则表达式
p = re.compile('^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$') if p.match(dom ...
- inux监控平台搭建-监控项
linux监控平台搭建-监控项 本人运维某生态互联网监控平台服务.过程中遇见了很多问题.目前互联网有很多的开源监控工具:nagios.zabbix.falcon.cacti...各有优点.这里不讲解监 ...
- Long.ValueOf("String") Long.parseLong("String") 区别 看JAVA包装类的封箱与拆箱
IP地址类型转换原理: 将一个点分十进制IP地址字符串转换成32位数字表示的IP地址(网络字节顺序). 将一个32位数字表示的IP地址转换成点分十进制IP地址字符串. 1.Long.ParseLong ...
- codeforces 757F - 最短路DAG+灭绝树
Description 给定一个n个点,m条边的带权无向图,和起点S.请你选择一个点u(u!=S),使得在图中删掉点u 后,有尽可能多的点到S的最短距离改变. Solution 先建出最短路DAG,在 ...
- Springboot - 在启动完成后执行特定方法
1.实现方式 实现ApplicationRunner接口 实现CommandLineRunner接口 @Component @Slf4j public class AfterServiceStarte ...
- 学习 表单验证插件validate
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Struts2的使用注解配置Action(零配置)
1.首先引入struts2注解的jar包:struts2-convention-plugin.jar ------------------------------第一种方式-------------- ...
- Spy++使用方法
原文转自 http://jingyan.baidu.com/article/3a2f7c2e76584a26aed61174.html 1.Spy++ 是Visual Studio 自带的工具(菜单& ...
- steam linux 使用socks代理
环境:Ubuntu 15.10 64bit,Steam:built:May 10 2016 需要的工具:ssh/shadowsocks等socks5代理,tsocks ---------------- ...
- VMware Workstation/Fusion 中安装 Fedora 23/24 及其他 Linux 系统时使用 Open VM Tools 代替 VMware Tools 增强工具的方法
VMware Workstation/Fusion 分别是 Windows/Linux 和 macOS 下面对应的桌面虚拟化软件.过去,在 VMware 中安装了操作系统虚拟机后,需要在虚拟机中再安装 ...