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? 如果有的话,输出字典序最小的路径 ...
随机推荐
- face detection[PyramidBox]
本文来自<PyramidBox: A Context-assisted Single Shot Face Detector>,是来自百度的作品,时间线为2018年8月. 0 引言 最近基于 ...
- odoo 11 之signup_with_phone模块分析
signup_with_phone模块的主要功能是允许用户用自己的手机号作为注册登录账号,这里会进行手机号码格式的严格检查,该模块依赖odoo自带的auth_signup注册模块. 该项目地址在htt ...
- 探讨.NET Core数据进行3DES加密和解密问题
前言 一直困扰着我关于数据加密这一块,24号晚上用了接近3个小时去完成一项任务,本以为立马能解决,但是为了保证数据的安全性,我们开始去对数据进行加密,然后接下来3个小时专门去研究加密这一块,然而用着用 ...
- WPF仿网易云音乐系列(三、播放进度条+控制按钮)
一.简介 上一篇,咱们基本把左侧导航栏给搞定,这一篇文章,开始来做一下播放进度条和控制按钮:老规矩,咱们先来看一下原版的效果: 首先,它这个专辑图片,有一个按钮效果,鼠标移入会显示出伸缩箭头:移出后消 ...
- H5 18-序选择器
18-序选择器 我是标题 我是段落1 我是段落2 我是段落3 我是段落4 我是段落5 我是段落6 我是段落7 我是段落8 --> 我是段落1 我是段落2 我是段落2 我是标题 <!DOCT ...
- webapack
webpack 就是一个前端资源加载.打包工具. 核心思想:会根据(js css less文件)模块依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源,减少页面请求. wapack ...
- mysql数据的导入和导出
一. mysqldump工具基本用法,不适用于大数据备份 1. 备份所有数据库: mysqldump -u root -p --all-databases > all_database_sq ...
- PHP中多个文件包含的问题 (一)
使用require或者include来包含文件时,包含的文件的内容相对性,这个很容易搞混,所以记录一下. 这个相对性包括 __DIR__,__FILE__,$_SERVER['PHP_SELF'],$ ...
- JUnit的配置及使用
一.安装插件JUnitGenertor V2.0 File->Setting->Plugins->在搜索框里输入JUintGenerator V2.0 二.导入JUnit相关jar包 ...
- Tomcat web.xml配置参数详解
Apache Tomcat Configuration Reference - The Context Containerhttps://tomcat.apache.org/tomcat-5.5-do ...