UVA 12171 Sculpture
https://vjudge.net/problem/UVA-12171
题目
某人设计雕塑,用的是很扯的方法:把一堆长方体拼起来。给出长方体的坐标和长宽高,求外表面积。因为要将这雕塑进行酸洗,需要知道$V_排$
输入长方体信息,输出外表面积和$V_排$
\[0\le 每个维度的坐标值\le 500\]
\[0\le长、宽、高 \le500\]
(不会描述了)
题解
有了紫书上的提示,还是写了两个小时……
离散化+bfs
将长方体出现的坐标都存入数组,然后排序,然后使用 unique 函数, unique 函数的返回值是指向末尾哨兵的迭代器(?),减去 begin 就可以得到剩下元素个数。
unique复杂度$O(数组原来元素个数)$,如果没有排序,那么 unique函数就没有效果(只会把与上一个元素相同的元素无视,把后面的元素移动到前面(覆盖),而不是像紫书那样说的重复元素移动到后面)
https://en.cppreference.com/w/cpp/algorithm/unique
将雕塑放进长宽高都大于500的容器里面,然后灌水,容器的体积减去水的体积就是$V_排$,水的内表面积就是雕塑的外表面积
如果水碰到了雕塑,那么就计算表面积……
三维也可以离散化,画个图可以看出来

有个技巧是用左上角的坐标来代表长方体
计算面积的时候可以选择无视某条边
调试的时候可以使用文件输入……最好一开始先用简单的数据
BIG小于1000会WA……
(不想解释了= =)
AC代码:
#include<bits/stdc++.h>
using namespace std;
#define REP(i,x,y) for(register int i=(x); i<(y); i++)
#define REPE(i,x,y) for(register int i=(x); i<=(y); i++)
#ifdef sahdsg
#define DBG(a,...) printf(a, ##__VA_ARGS__)
#else
#define DBG(a,...) (void)0
#endif
#define BIG 1008
template <class T>
inline void read(T& x) {
char c=getchar();int f=1;x=0;
while(!isdigit(c)&&c!='-')c=getchar();if(c=='-')f=-1,c=getchar();
while(isdigit(c)){x=x*10+c-'0';c=getchar();}x*=f;
} struct _b {
int x_0, y_0, z_0;
int x_1, y_1, z_1;
} b[51];
int x[108], y[108], z[108];
int nx , ny , nz;
int cube[108][108][108];
int ans1=0, ans2=0;
struct node {
int x,y,z;
};
const int dx[] = { 0, 0,-1, 0, 0, 1};
const int dy[] = { 0,-1, 0, 0, 1, 0};
const int dz[] = {-1, 0, 0, 1, 0, 0};
void getans() {
ans1=0, ans2=BIG*BIG*BIG;
queue<node> q;
q.push((node){0,0,0});
cube[0][0][0]=2;
int delx=x[1]-x[0];
int dely=y[1]-y[0];
int delz=z[1]-z[0];
ans2-=delx*dely*delz;
while(!q.empty()) {
node now = q.front(); q.pop();
REP(i,0,6) {
int newx = now.x+dx[i], newy = now.y+dy[i], newz = now.z+dz[i];
if(newx<nx-1 && newx>=0)
if(newy<ny-1 && newy>=0)
if(newz<nz-1 && newz>=0) {
if(cube[newx][newy][newz]==0) {
q.push((node){newx,newy,newz});
cube[newx][newy][newz]=2;
int delx=x[newx+1]-x[newx];
int dely=y[newy+1]-y[newy];
int delz=z[newz+1]-z[newz];
// DBG("```%d %d %d\n", delx, dely, delz);
ans2-=delx*dely*delz;
} else if(cube[newx][newy][newz]==1) {
int delx=dx[i]?1:(x[newx+1]-x[newx]);
int dely=dy[i]?1:(y[newy+1]-y[newy]);
int delz=dz[i]?1:(z[newz+1]-z[newz]);
ans1+=delx*dely*delz; }
}
}
}
}
int main() {
#ifdef sahdsg
freopen("in.txt","r",stdin);
#endif
int T; scanf("%d", &T);
while(0<T--) {
int n; scanf("%d", &n);
REP(i,0,n) {
read(b[i].x_0); read(b[i].y_0); read(b[i].z_0);
read(b[i].x_1); read(b[i].y_1); read(b[i].z_1); b[i].x_1+=b[i].x_0;
b[i].y_1+=b[i].y_0;
b[i].z_1+=b[i].z_0;
#define op(k) k[i*2]=b[i].k##_0; k[i*2+1]=b[i].k##_1;
op(x);op(y);op(z);
#undef op }
x[2*n]=BIG-1;y[2*n]=BIG-1;z[2*n]=BIG-1;
x[2*n+1]=-1;y[2*n+1]=-1;z[2*n+1]=-1;
sort(x,x+2*n+2); sort(y,y+2*n+2); sort(z,z+2*n+2);
nx = unique(x,x+2*n+2)-x;
ny = unique(y,y+2*n+2)-y;
nz = unique(z,z+2*n+2)-z;
memset(cube,0,sizeof cube);
// REP(i,0,nx) REP(j,0,ny) REP(k,0,nz) DBG("```%d\t%d\t%d\n", x[i], y[j], z[k]);
REP(i,0,n) {
#define op(k) \
b[i].k##_0=lower_bound(k, k+n##k, b[i].k##_0)-k;\
b[i].k##_1=lower_bound(k, k+n##k, b[i].k##_1)-k;
op(x);op(y);op(z);
#undef op
// DBG("%d\t%d\n%d\t%d\n%d\t%d\n", b[i].x_0,b[i].x_1,b[i].y_0,b[i].y_1,b[i].z_0,b[i].z_1);
REP(qx,b[i].x_0,b[i].x_1) REP(qy,b[i].y_0,b[i].y_1) REP(qz,b[i].z_0,b[i].z_1) {
cube[qx][qy][qz]=1;
}
}
getans();
printf("%d %d\n", ans1, ans2); }
return 0;
}
UVA 12171 Sculpture的更多相关文章
- Uva 12171 Sculpture - 离散化 + floodfill
题目连接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- hdu 2771(uva 12171) Sculpture bfs+离散化
题意: 给出一些边平行于坐标轴的长方体,这些长方体可能相交.也可能相互嵌套.这些长方体形成了一个雕塑,求这个雕塑的整体积和表面积. 题解: 最easy想到直接进行bfs或者dfs统计,但此题的麻烦之处 ...
- 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个点就足够表示红 ...
- UVa 12171 题解
英文题面不怎么友好,大家还是自行通过紫书了解题面吧... 解题思路: 1. 面对500 ^ 3的数据范围,我们需要先用离散化解决掉爆空间的问题. 2. 由于我们要求的总体积包括内空部分的体积,我们可以 ...
- UVa Sculpture(离散化 floodfill)
题意: 给定n个立方体的一个顶点坐标和3边长度, 问这些立方体组成的雕塑的表面积和体积, 坐标都是整数,n最大为50, 最大为500, 边长最大也是500. 分析: 继UVa221后又一道离散 ...
- uva 1354 Mobile Computing ——yhx
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGcAAANuCAYAAAC7f2QuAAAgAElEQVR4nOy9XUhjWbo3vu72RRgkF5
- UVA 10564 Paths through the Hourglass[DP 打印]
UVA - 10564 Paths through the Hourglass 题意: 要求从第一层走到最下面一层,只能往左下或右下走 问有多少条路径之和刚好等于S? 如果有的话,输出字典序最小的路径 ...
随机推荐
- JSP报错:The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
今天使用Eclipse+Maven建立了一个Javaweb工程,并在eclipse中配置了Web容器Jboss eap 6.2.新建jsp页面,添加一个简单 的Java类.可是,JSP页面顶端出现“红 ...
- apt查找安装包
1.查找名称含openblas的安装包 apt-cache search openblas
- FineUIPro v3.5.0发布了,减少 90% 的上行数据量,15行代码全搞定!
一切为客户着想 一切的一切还得从和一位台湾客户的沟通说起: 客户提到将ViewState保存在服务器端以减少上行数据量,从而加快页面的回发速度. 但是在FineUI中,控件状态都保存在FState中, ...
- 图解HTTP,TCP,IP,MAC的关系
入门 用户发了一个HTTP的请求,想要访问我们网站的首页,这个HTTP请求被放在一个TCP报文中,再被放到一个IP数据报中,最终的目的地就是我们的115.39.19.22. 进阶 IP数据报其实是通过 ...
- Filebeat简介
原文地址:http://blog.51cto.com/seekerwolf/2110174 收集日志的目的是有效的利用日志,有效利用日志的前提是日志经过格式化符合我们的要求,这样才能真正的高效利用收集 ...
- eclipse 执行自带的maven命令无效
原文地址:https://blog.csdn.net/qq_26386171/article/details/78262702 下面加上(前提是你的环境变量里已经配置过) -Dmaven.multiM ...
- itoa()函数和atoi()函数详解
C语言提供了几个标准库函数,可以将任意类型(整型.长整型.浮点型等)的数字转换为字符串. 以下是用itoa()函数将整数转换为字符串的一个例子:# include <stdio.h># i ...
- python学习第十篇——while 的灵活运用
sandwiches_orders = ['apple','banana','mango',"apple","watermelon"] finished_san ...
- H5上传图片之canvas
H5上传图片之canvas,使用canvas处理压缩图片再上传 html代码: <form action="" method="post"> < ...
- C#使用OneNote的图片文字识别功能(OCR)
http://www.cnblogs.com/Charltsing/p/OneNoteOCR.html 有需要技术咨询的,联系QQ564955427 前段时间有人问我能不能通过OneNote扫描图片, ...