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? 如果有的话,输出字典序最小的路径 ...
随机推荐
- odoo常用widget
widget=”statusbar” 头部状态条标签widget=”email” 电子邮件地址标签widget=”selection” 下拉选择标签widget=”mail_followers” ...
- 在windows下安装Redis
一.下载windows版本的Redis 由于官网上没有windows版的下载地址,所以需要下载windows版本的Redis有以下两个地址: 博主的csdn资源地址:http://download.c ...
- 微信小程序页面跳转方法总结
微信小程序页面跳转目前有以下方法(不全面的欢迎补充): 1. 利用小程序提供的 API 跳转: // 保留当前页面,跳转到应用内的某个页面,使用wx.navigateBack可以返回到原页面.// 注 ...
- VS2012添加数据库连接时报错,未能加载文件或程序集microsoft.sqlserver.management.sdk.sfc
今天在VS2012中添加数据库连接时报错 未能加载文件或程序集microsoft.sqlserver.management.sdk.sfc,Version=11.0 查了很多资料,最后下载安装了Sha ...
- 2018 Multi-University Training Contest 1
比赛链接:2018 Multi-University Training Contest 1 6301 Distinct Values 题意:输出一个长度为n的序列,要求满足m个区间的数都不相同,并且字 ...
- es6在网页中模块引入的方法
前言: 以前,当然包括现在的大部分js引入,我们都是利用<script></script>这种全局的方式进行引入,当然这种弊端还是用的,比如这样直接利用script引入的话,会 ...
- Python容器
列表 list 1.列表的格式为,把值放入[ ]中 >>> lis = ['a', 1, ['a', 'c', 1]] 2.列表中可以嵌套任何类型 索引 因为列表是有序的,那么我们可 ...
- Mysql 中的MVCC原理,undo日志的依赖
一. MVCC 原理了解 原文点击:MVCC原理浅析 读锁: 也叫共享锁.S锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的 ...
- Linux之磁盘挂载
1.查看磁盘分区情况: fdisk -l 可以看到,红框中的硬盘没有分区. 2.开始分区: fdisk /dev/vdb 3.格式化分区: mkfs.xfs 分区名 4.挂载磁盘 挂载方式1: 手动挂 ...
- 测试python最大递归层次
转自:https://www.cnblogs.com/xiongdashuai/p/6243372.html python默认的最大递归层数: 运行环境:Windows 7,x64python环境:p ...