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? 如果有的话,输出字典序最小的路径 ...
随机推荐
- centos 7 安装mqtt 修改用户名和密码
我先新买个Centos 的系统 咱登录呢就用这个软件,主要是方便,可以少安装一些东西 根据自己的系统选择,上面的是32位的. 输入 root 回车 输入密码然后回车 输入的时候什么也不显示 输入 c ...
- OPPO Developers Conference(2018.12.26)
时间:2018.12.26地点:北京国家会议中心
- 搭建SpringBoot+dubbo+zookeeper+maven框架(三)
今天我们要在原来搭建的框架基础上集成redis数据库. redis是Nosql数据库中使用较为广泛的非关系型内存数据库,redis内部是一个key-value存储系统.它支持存储的value类型相对更 ...
- 从源码看Spring Security之采坑笔记(Spring Boot篇)
一:唠嗑 鼓捣了两天的Spring Security,踩了不少坑.如果你在学Spring Security,恰好又是使用的Spring Boot,那么给我点个赞吧!这篇博客将会让你了解Spring S ...
- 10分钟开发 GPS 应用,了解一下
1 前言 在导师公司实习了半个月,参加的是尾气遥测项目,我的任务是开发GPS 的相关事情,从零到有的开发出了 GPS 的 Winform 应用,在这里记录一下开发过程和简要的描述一下将 GPS 数据提 ...
- SQLite 实现删除表中前一天的数据
注意点1 要注意SQLite datatime()函数为何获取不到系统本地时间?这个问题,坑死我了. 解决方法详见这篇文章:SQLite datatime()函数为何获取不到系统本地时间? 注意点2: ...
- 简单的将Excel数据同步到SqlServer数据库中
1.创建一个WinForm程序,添加一个Button控件 2.Button事件 private void button1_Click(object sender, EventArgs e) { Sys ...
- App Inspector-iOS真机功能详解
前言: App Inspector:浏览器端的移动设备 UI 查看器,使用树状态结构查看 UI 布局,自动生成 XPaths.官网:https://macacajs.github.io/app-ins ...
- 广州商学院16级软工一班&二班-第一次作业成绩
广州商学院16级软工一班&二班-第一次作业成绩 作业地址 16软工一班 16软工二班 总结 本次作业反映了几个比较严重的问题: 不按要求阅读相应的文章,回答问题只是敷衍几句. 部分同学的版式混 ...
- 16-使用Selenium模拟浏览器抓取淘宝商品美食信息
淘宝由于含有很多请求参数和加密参数,如果直接分析ajax会非常繁琐,selenium自动化测试工具可以驱动浏览器自动完成一些操作,如模拟点击.输入.下拉等,这样我们只需要关心操作而不需要关心后台发生了 ...