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的更多相关文章

  1. Uva 12171 Sculpture - 离散化 + floodfill

    题目连接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  2. hdu 2771(uva 12171) Sculpture bfs+离散化

    题意: 给出一些边平行于坐标轴的长方体,这些长方体可能相交.也可能相互嵌套.这些长方体形成了一个雕塑,求这个雕塑的整体积和表面积. 题解: 最easy想到直接进行bfs或者dfs统计,但此题的麻烦之处 ...

  3. UVa 12171 (离散化 floodfill) Sculpture

    题意: 三维空间中有n个长方体组成的雕塑,求表面积和体积. 分析: 我们可以在最外边加一圈“空气”,然后求空气的连通块的体积,最后用总体积减去即是雕塑的体积. 还有一个很“严重”的问题就是5003所占 ...

  4. uva 12171 hdu 1771 Sculpture

    //这题从十一点开始写了四十分钟 然后查错一小时+ 要吐了 这题题意是给很多矩形的左下角(x,y,z最小的那个角)和三边的长(不是x,y,z最大的那个角T-T),为组成图形的面积与表面积(包在内部的之 ...

  5. UVA 12171 (hdu 2771)sculptrue(离散化)

    以前对离散化的理解不够,所以把端点和区间区分来考虑但是做完这题以后有了新的认识: 先来看一个问题:给你以下的网格,你需要多少空间去存储红点区间的信息呢? 只需要图上所示的1,2,3,4个点就足够表示红 ...

  6. UVa 12171 题解

    英文题面不怎么友好,大家还是自行通过紫书了解题面吧... 解题思路: 1. 面对500 ^ 3的数据范围,我们需要先用离散化解决掉爆空间的问题. 2. 由于我们要求的总体积包括内空部分的体积,我们可以 ...

  7. UVa Sculpture(离散化 floodfill)

    题意: 给定n个立方体的一个顶点坐标和3边长度,  问这些立方体组成的雕塑的表面积和体积,   坐标都是整数,n最大为50,  最大为500, 边长最大也是500. 分析: 继UVa221后又一道离散 ...

  8. uva 1354 Mobile Computing ——yhx

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGcAAANuCAYAAAC7f2QuAAAgAElEQVR4nOy9XUhjWbo3vu72RRgkF5

  9. UVA 10564 Paths through the Hourglass[DP 打印]

    UVA - 10564 Paths through the Hourglass 题意: 要求从第一层走到最下面一层,只能往左下或右下走 问有多少条路径之和刚好等于S? 如果有的话,输出字典序最小的路径 ...

随机推荐

  1. Clustering[Introduction]

    0. 聚类步骤 为了完成一个聚类任务,必须遵循以下步骤: 特征选择:合适的选择特征,尽可能多的包含任务关心的信息,使得信息冗余减少和最小化是主要目标: 近邻测度:用于定量测量两个特征向量如何" ...

  2. 【转】MySQL中的行级锁,表级锁,页级锁

    在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在数据库的锁机制中介绍过,在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引 ...

  3. element-ui中 table表格hover 修改背景色

    增加样式级别就行啦   .el-table--enable-row-hover .el-table__body tr:hover>td{ background-color: #212e3e !i ...

  4. mybatis源码- 反射模块一(跟着MyBatis学反射):类级别信息的封装

    目录 1 JavaBean 规范 2 Reflector和ReflectorFactory 2.1 Reflector 属性 2.1.1 属性 2.1.2 Invoker 接口 2.2 Reflect ...

  5. codeforces#1090 D. New Year and the Permutation Concatenation(打表找规律)

    题意:给出一个n,生成n的所有全排列,将他们按顺序前后拼接在一起组成一个新的序列,问有多少个长度为n的连续的子序列和为(n+1)*n/2 题解:由于只有一个输入,第一感觉就是打表找规律,虽然表打出来了 ...

  6. Ordering Tasks

    链接 [https://vjudge.net/contest/281085#problem/D] 题意 有n个任务,有M个对先后顺序 然你输出最后的完成任务的顺序,有多种可能输出一种即可 分析 裸的拓 ...

  7. Elasticsearch - 简单介绍

    Elasticsearch 简介 1. 什么是 Elasticsearch ElasticSearch 是一个基于 Lucene 的搜索服务器. 它了一个分布式多 用户能力的全文搜索引擎,能够达到实时 ...

  8. #Leetcode# 1009. Complement of Base 10 Integer

    https://leetcode.com/problems/complement-of-base-10-integer/ Every non-negative integer N has a bina ...

  9. 牛客OI周赛8-普及组

    https://ac.nowcoder.com/acm/contest/543#question A. 代码: #include <bits/stdc++.h> using namespa ...

  10. sys模块进度条玩法笔记

    #! /user/bin/env python# -*- encoding:utf-8 -*-import time,sys for i in range(31): sys.stdout.write( ...