UVa 12171 题解

英文题面不怎么友好,大家还是自行通过紫书了解题面吧。。。
解题思路:
1. 面对500 ^ 3的数据范围,我们需要先用离散化解决掉爆空间的问题。
2. 由于我们要求的总体积包括内空部分的体积,我们可以用flood_fill来解决。
注意事项:(几个细节问题)
1. unique函数的正确使用姿势:如果是从一开始存数,注意最后要多减去1.
2. 染色时每个三维坐标上的点代表一个长方形,所以右端点不能染色。
3. 可以用结构体封装一下各个操作。
AC代码:
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#include <cstdio>
#include <cstdlib> using namespace std; const int dx[] = {, -, , , , };
const int dy[] = {, , , -, , };
const int dz[] = {, , , , , -}; int T, n, v, s;
int x1[], y1[], z1[], x0[], y0[], z0[]; int nx = , ny = , nz= ;
int lx[], ly[], lz[];
int color[][][]; struct cell{
int x, y, z; cell(int x = , int y = , int z = ): x(x), y(y), z(z) {} void setvis() const { color[x][y][z] = ; } bool getvis() const { return color[x][y][z] == ; } bool issolid() const { return color[x][y][z] == ; } bool invalid() const {
if (x <= || y <= || z <= || x >= nx || y >= ny || z >= nz ) return true;
return false;
} int area(int dir) const {
if (dx[dir] != ) return (ly[y + ] - ly[y]) * (lz[z + ] - lz[z]);
else if (dy[dir] != ) return (lx[x + ] - lx[x]) * (lz[z + ] - lz[z]);
return (lx[x + ] - lx[x]) * (ly[y + ] - ly[y]);
} int volume() const { return (lx[x + ] - lx[x]) * (ly[y + ] - ly[y]) * (lz[z + ] - lz[z]); } }; int read()
{
int x = ;
int k = ;
char c = getchar(); while (c > '' || c < '')
if (c == '-') k = -, c = getchar();
else c = getchar();
while (c >= '' && c <= '')
x = x * + c - '',
c = getchar(); return k * x;
} void discretization(int* x, int& l)
{
sort(x + , x + l + );
l = unique(x + , x + l + ) - x - ;
} int get_ID(int *x, int l, int k)
{
return lower_bound(x + , x + l + , k) - x;
} void flood_fill()
{
cell c(, , );
c.setvis();
queue<cell> q;
q.push(c);
while (!q.empty())
{
cell c = q.front();
q.pop();
v += c.volume();
for (int i = ; i < ; ++i)
{
cell c2(c.x + dx[i], c.y + dy[i], c.z + dz[i]);
if (c2.invalid()) continue;
if (c2.issolid()) s += c2.area(i);
else if (!c2.getvis())
{
c2.setvis();
q.push(c2);
}
}
}
v = * * - v;
} int main()
{
T = read();
while (T--)
{
v = , s = ;
memset(color, , sizeof(color));
n = read();
lx[] = ly[] = lz[] = ;
lx[] = ly[] = lz[] = ;
nx = ny = nz = ;
for (int i = ; i <= n; ++i)
x0[i] = read(),
y0[i] = read(),
z0[i] = read(),
x1[i] = read(),
y1[i] = read(),
z1[i] = read(),
lx[++nx] = x0[i],
lx[++nx] = x0[i] + x1[i],
ly[++ny] = y0[i],
ly[++ny] = y0[i] + y1[i],
lz[++nz] = z0[i],
lz[++nz] = z0[i] + z1[i]; discretization(lx, nx);
discretization(ly, ny);
discretization(lz, nz); for (int t = ; t <= n; ++t)
{
int sx = get_ID(lx, nx, x0[t]);
int ex = get_ID(lx, nx, x0[t] + x1[t]);
int sy = get_ID(ly, ny, y0[t]);
int ey = get_ID(ly, ny, y0[t] + y1[t]);
int sz = get_ID(lz, nz, z0[t]);
int ez = get_ID(lz, nz, z0[t] + z1[t]);
for (int i = sx; i < ex; ++i)
for (int j = sy; j < ey; ++j)
for (int l = sz; l < ez; ++l)
color[i][j][l] = ;
} flood_fill(); printf("%d %d\n", s, v);
}
}
UVa 12171 题解的更多相关文章
- Uva 12171 Sculpture - 离散化 + floodfill
题目连接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- UVA 12171 Sculpture
https://vjudge.net/problem/UVA-12171 题目 某人设计雕塑,用的是很扯的方法:把一堆长方体拼起来.给出长方体的坐标和长宽高,求外表面积.因为要将这雕塑进行酸洗,需要知 ...
- hdu 2771(uva 12171) Sculpture bfs+离散化
题意: 给出一些边平行于坐标轴的长方体,这些长方体可能相交.也可能相互嵌套.这些长方体形成了一个雕塑,求这个雕塑的整体积和表面积. 题解: 最easy想到直接进行bfs或者dfs统计,但此题的麻烦之处 ...
- UVA 10131题解
第一次写动态规划的代码,整了一天,终于AC. 题目: Question 1: Is Bigger Smarter? The Problem Some people think that the big ...
- 位运算基础(Uva 1590,Uva 509题解)
逻辑运算 规则 符号 与 只有1 and 1 = 1,其他均为0 & 或 只有0 or 0 = 0,其他均为1 | 非 也就是取反 ~ 异或 相异为1相同为0 ^ 同或 相同为1相异为0,c中 ...
- 【OI】计算分子量 Molar mass UVa 1586 题解
题目:(由于UVa注册不了,还是用vjudge) https://vjudge.net/problem/UVA-1586 详细说明放在了注释里面.原创. 破题点在于对于一个元素的组合(元素+个数),只 ...
- UVa 12171 (离散化 floodfill) Sculpture
题意: 三维空间中有n个长方体组成的雕塑,求表面积和体积. 分析: 我们可以在最外边加一圈“空气”,然后求空气的连通块的体积,最后用总体积减去即是雕塑的体积. 还有一个很“严重”的问题就是5003所占 ...
- uva 12171 hdu 1771 Sculpture
//这题从十一点开始写了四十分钟 然后查错一小时+ 要吐了 这题题意是给很多矩形的左下角(x,y,z最小的那个角)和三边的长(不是x,y,z最大的那个角T-T),为组成图形的面积与表面积(包在内部的之 ...
- UVA 12171 (hdu 2771)sculptrue(离散化)
以前对离散化的理解不够,所以把端点和区间区分来考虑但是做完这题以后有了新的认识: 先来看一个问题:给你以下的网格,你需要多少空间去存储红点区间的信息呢? 只需要图上所示的1,2,3,4个点就足够表示红 ...
随机推荐
- mysql实现rownum方法
1.语句:SELECT @rownum:=@rownum+1 AS rownum, Orderstate.* FROM (SELECT @rownum:=0) r, Orderstate ; 执行结果 ...
- $.extend(),与$.fn.extend() 讲解(一)
jQuery插件的开发包括两种: 一种是类级别的插件开发,即给jQuery添加新的全局函数,相当于给jQuery类本身添加方法.jQuery的全局函数就是属于jQuery命名空间的函数,另一种是对象级 ...
- css 文本溢出时显示省略号
.text-ellipsis { width:100px; height:60px; overflow: hidden;//隐藏滚动条 text-overflow:ellipsis; white-sp ...
- 【手撸一个ORM】第四步、Expression(表达式目录树)扩展
到这里,Orm的基架已经搭起来了,接下来就是激动人心的部分,表达式目录树转Sql语句,SqlDataReader转数据实体等等,但是在这之前,我们需要扩展下表达式目录树的方法,以方便后面的相关操作. ...
- 爬虫(ProxyHandler)——代理
工具:python3 步骤: 1)使用ProxyHandler()构建httpproxy_handler对象 2)使用build_opener(httpproxy_handler)构建opener 3 ...
- C语言-字符操作函数
1字符数组的初始化: 1.1 char string={'c','h','i','n','a'} 1.2char string={"china"}或者去掉{}即char strin ...
- Java @Validated 遇到的大坑
我在一个Controller内,在两个方法内使用@Validated,这是两个POST方法会进入的方法,这两个方法的实体类的命名(下图红框内容)不能一样,一样的话就会导致第二个在页面显示不出来错误信息 ...
- java Integer判等的大坑
在-128 至 127 范围内的赋值,Integer 对象是在IntegerCache.cache 产生,会复用已有对象,这个区间内的 Integer 值可以直接使用==进行 判断,但是这个区间之外的 ...
- 重写FileUpload控件让它可以显示上传后的文件名
我在以前的开发中经常遇到这样的场景:文件上传之后需要显示文件名,但是asp.net自带的fileupload是不能付给上传后的文件名值的. 以前都是做一个label显示的,今天想起来了,写个控件封装一 ...
- VS2012,更新补丁后的残忍--创建项目未找到与约束匹配的导出
解决方法网址:http://blog.csdn.net/jly4758/article/details/18660945