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

这题题意是给很多矩形的左下角(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. 星际争霸反作弊AG对战平台_支持108,113

    星际争霸反作弊AG对战平台_支持108,113,116 强大的星际反作弊功能,对战神器,让玩家公平对战 目前腾讯对战,浩方对战,VS对战平台都有星际外挂,AG平台什么都不干专门反外挂,希望热爱星际的玩 ...

  2. SQL Server 无法启动之TCP端口占用

    场景再现: ---------------------------------------------------------------------------------------------- ...

  3. 利用jQuery打造个性网站

    网页结构 编写全局样式(reset.css) /*全局样式*/ body,h1,h2,h3,h4,h5,h6,hr,p,blockquote,dl,dt,dd,ul,ol,li,pre,form,fi ...

  4. Oracle EBS-SQL (WIP-1):检查非标任务没挂需求.sql

    SELECT WE.WIP_ENTITY_NAME, MSI.SEGMENT1, MSI.DESCRIPTION, WDJ.CLASS_CODE, WDJ.START_QUANTITY, WDJ.SC ...

  5. 如何修改被编译后DLL文件

    原文 http://www.cnblogs.com/wujy/p/3275855.html 我们平时在工作中经常会遇到一些已经被编译后的DLL,而且更加麻烦是没有源代码可以进行修改,只能针对这个DLL ...

  6. Java_SSH项目主要步骤记录

    建立Spring-Struts-Hibernate的步骤整理 1. 建立web project 2. 建立hernate, action, service包 3. 右击项目,add myeclipse ...

  7. Objective-C编程调试技巧

    为Objective-C编程调试技巧(译) http://www.cocoawithlove.com/2008/10/debugging-tips-for-objective-c.html 这篇文章是 ...

  8. Linux网络设备驱动架構學習(三)

    Linux网络设备驱动架構學習(三) 接下來會從以下幾個方面介紹網絡設備驅動的編寫流程: 1.網絡設備的註冊與註銷 2.網絡設備的初始化 3.網絡設備的打開與釋放 4.網絡數據發送流程 5.網絡數據接 ...

  9. Linux学习之十三、快捷键与通配符、数据流重导向

    通配符与特殊符号 接下来让我们利用通配符来玩些东西吧!首先,利用通配符配合 ls 找檔名看看: [root@www ~]# LANG=C              <==由于与编码有关,先配置语 ...

  10. Productivity Improvements for the Entity Framework(实体框架设计)【转】

    Background We’ve been hearing a lot of good feedback on the recently released update to the Entity F ...