//这题从十一点开始写了四十分钟 然后查错一小时+ 要吐了

这题题意是给很多矩形的左下角(x,y,z最小的那个角)和三边的长(不是x,y,z最大的那个角T-T),为组成图形的面积与表面积(包在内部的之算体积不算表面积)

解法:离散化+bfs,先把范围扩大(相当于在周围加上空气),然后bfs,遇到表面积直接加入,遇到非长方体的部分也直接加入,最后用总体积减去空气的体积,这样就可以把内部的体积计算进来而不计算其表面积。因为坐标范围比较大,要先离散化。

//其实我对这题一直耿耿于怀,当年没进省队多少与这题有关

//昨天没出题 明天周五课少 出两题

 #include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<vector>
#include<map>
#include<stack>
#include<string> using namespace std; const int u[]={,,,,,-};
const int v[]={,-,,,,};
const int w[]={,,,-,,}; struct rec{
int x1,y1,z1,x2,y2,z2;
}; struct POINT{
int x,y,z;
}; bool vis[][][];
bool loc[][][];
int n,T,ans1,ans2;
int x[],y[],z[];
rec p[];
int numx,numy,numz; int IDX(int aim){
return lower_bound(x,x+numx,aim)-x;
} int IDY(int aim){
return lower_bound(y,y+numy,aim)-y;
} int IDZ(int aim){
return lower_bound(z,z+numz,aim)-z;
} int solve(int flag,int nowx,int nowy,int nowz){//计算表面积
if (flag==) return (x[nowx+]-x[nowx])*(z[nowz+]-z[nowz]);
if (flag==) return (x[nowx+]-x[nowx])*(z[nowz+]-z[nowz]);
if (flag==) return (x[nowx+]-x[nowx])*(y[nowy+]-y[nowy]);
if (flag==) return (x[nowx+]-x[nowx])*(y[nowy+]-y[nowy]);
if (flag==) return (z[nowz+]-z[nowz])*(y[nowy+]-y[nowy]);
if (flag==) return (z[nowz+]-z[nowz])*(y[nowy+]-y[nowy]);
return -;
} void bfs(){
queue<POINT> q;
while (!q.empty()) q.pop();
q.push((POINT){,,});
ans2=(x[]-x[])*(y[]-y[])*(z[]-z[]);
vis[][][]=;
while (!q.empty()){
POINT now=q.front();
q.pop();
for (int i=;i<;i++){
int tx=now.x+u[i];
int ty=now.y+v[i];
int tz=now.z+w[i];
if (tx< || tx>=numx- || ty< || ty>=numy- || tz< || tz>=numz- || vis[tx][ty][tz]) continue;
if (loc[tx][ty][tz]){
ans1+=solve(i,now.x,now.y,now.z);
}
else{
ans2+=(x[tx+]-x[tx])*(y[ty+]-y[ty])*(z[tz+]-z[tz]);
vis[tx][ty][tz]=;
q.push((POINT){tx,ty,tz});
}
}
}
} int main(){
scanf("%d",&T);
for (int cas=;cas<=T;cas++){
scanf("%d",&n);
for (int i=;i<n;i++){
scanf("%d%d%d%d%d%d",&p[i].x1,&p[i].y1,&p[i].z1,&p[i].x2,&p[i].y2,&p[i].z2);
p[i].x2+=p[i].x1;
p[i].y2+=p[i].y1;
p[i].z2+=p[i].z1;
x[*i+]=p[i].x1;
x[*i+]=p[i].x2;
y[*i+]=p[i].y1;
y[*i+]=p[i].y2;
z[*i+]=p[i].z1;
z[*i+]=p[i].z2;//先把坐算出来
}
x[]=;
y[]=;
z[]=;
x[*n+]=;
y[*n+]=;
z[*n+]=;//拓展范围
sort(x,x+*n+);
sort(y,y+*n+);
sort(z,z+*n+);
numx=unique(x,x+*n+)-x;
numy=unique(y,y+*n+)-y;
numz=unique(z,z+*n+)-z;//离散化
memset(loc,,sizeof(loc));
memset(vis,,sizeof(vis));
for (int now=;now<n;now++){
for (int i=IDX(p[now].x1);i<IDX(p[now].x2);i++){
for (int j=IDY(p[now].y1);j<IDY(p[now].y2);j++){
for (int k=IDZ(p[now].z1);k<IDZ(p[now].z2);k++){
loc[i][j][k]=;//记录矩形位置
}
}
}
}
ans1=;//^2
ans2=;//^3
bfs();
ans2=x[numx-]*y[numy-]*z[numz-]-ans2;//总体积减去空气体积
printf("%d %d\n",ans1,ans2);
}
return ;
}
/*
1
2
1 2 3 3 4 5
6 2 3 3 4 5 1
7
1 1 1 5 5 1
1 1 10 5 5 1
1 1 2 1 4 8
2 1 2 4 1 8
5 2 2 1 4 8
1 5 2 4 1 8
3 3 4 1 1 1 2
2
1 2 3 3 4 5
6 2 3 3 4 5
7
1 1 1 5 5 1
1 1 10 5 5 1
1 1 2 1 4 8
2 1 2 4 1 8
5 2 2 1 4 8
1 5 2 4 1 8
3 3 4 1 1 1
*/

uva 12171 hdu 1771 Sculpture的更多相关文章

  1. UVa 12171 (离散化 floodfill) Sculpture

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

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

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

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

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

  4. Uva 12171 Sculpture - 离散化 + floodfill

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

  5. UVA 12171 Sculpture

    https://vjudge.net/problem/UVA-12171 题目 某人设计雕塑,用的是很扯的方法:把一堆长方体拼起来.给出长方体的坐标和长宽高,求外表面积.因为要将这雕塑进行酸洗,需要知 ...

  6. UVA 10816 + HDU 1839 Dijstra + 二分 (待研究)

    UVA 题意:两个绿洲之间是沙漠,沙漠的温度不同,告诉起点,终点,求使得从起点到终点的最高温度最小的路径,如果有多条,输出长度最短的路径: 思路:用最小费用(最短路径)最大流(最小温度)也能搞吧,但因 ...

  7. Uva 10007 / HDU 1131 - Count the Trees (卡特兰数)

     Count the Trees  Another common social inability is known as ACM (Abnormally Compulsive Meditation) ...

  8. uva 215 hdu 1455 uvalive5522 poj 1011 sticks

    //这题又折腾了两天 心好累 //poj.hdu数据极弱,找虐请上uvalive 题意:给出n个数,将其分为任意份,每份里的数字和为同一个值.求每份里数字和可能的最小值. 解法:dfs+剪枝 1.按降 ...

  9. uva 437 hdu 1069

    dp  将石块按三个面存入队列  按底面积排序  dp就最大高度  按嵌套矩形最长路做做法 #include <iostream> #include <cstdio> #inc ...

随机推荐

  1. jquery EsayUi 里一个小弹框

    网站后台大多的数据展示就都用和此插件有着密切的关系: 来用一下这个小弹框吧: 一个Html里面的代码 <link rel='stylesheet' type='text/css' href='c ...

  2. PCL学习笔记(一)

    由于项目需要,开始学习一下HP公司的PCL打印语言,发现这方面的中文资料非常少,我做下记录也为后人提供便利. 关于PCL的介绍可以参考wiki百科 http://zh.wikipedia.org/zh ...

  3. Tomcat Remote Debug操作和原理

    操作篇 这部分主要讲,如何开启tomcat远程调试,并佐以实例.本文方式适用于windows和linux. 假设有两台机器,A是tomcat服务器所在机器,B是IDE安装机器.A和B可以是同一台机器, ...

  4. 安装 Archlinux 小记

    故事的背景 开始的时候装的 win8 + ubuntu 双系统,但是慢慢感觉只要有 windows 存在,在 Linux 上遇到问题了就想逃回去. 在一次 GDG 的演讲中听到的: 趁现在还年轻,还有 ...

  5. linux自带有usb驱动,为什么还需要libusb呢

    linux里的软件分为用户层和内核层两种.比如内核里编译了温度传感器的驱动,还得有lm-sensors在用户层负责解释处理内核递交出的数据.usb驱动是硬件驱动方面的东西,libusb是给应用软件开发 ...

  6. 普林斯顿大学算法课 Algorithm Part I Week 3 排序稳定性 Stability

    稳定性(Stability):先按性质A排序,再按性质B排序,性质B相同的那些项是否仍然是按性质A排序的? 一个稳定的排序,相同值的元素应仍保持相对顺序(relative order) 稳定的算法:插 ...

  7. 实现在ios文件读写

    文件都是用来读写数据的,可是哪里都会有潜规则,ios里面读写数据的潜规则你知不知道,你知道不知道!!! 你有没有觉得NSUserDefaults和NSBundle,plist这些玩意阴魂不散,有时候搞 ...

  8. Struts2 三、指定Struts2处理的请求后缀

    Action的请求通常情况下默认为以.action结尾,例如:http://localhost:9000/Struts2/hello/helloAction_sayHello.action    .a ...

  9. linux学习之(五)-linux文解压、压缩、安装

    查看一个文件的类型 命令:  file  文件名 创建一个.tar类型的压缩包使用命令:tar -cvf    [文件名].tar  目录   例:tar -cvf   a.tar    yasuo/ ...

  10. iOS_根据文字字数动态确定Label宽高

    iOS7中用以下方法 CGSize 替代过时的iOS6中的- (CGSize)sizeWithFont:(UIFont *)font 方法 // iOS7_API_根据文字 字数动态确定Label宽高 ...