//这题从十一点开始写了四十分钟 然后查错一小时+ 要吐了
这题题意是给很多矩形的左下角(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的更多相关文章
-
UVa 12171 (离散化 floodfill) Sculpture
题意: 三维空间中有n个长方体组成的雕塑,求表面积和体积. 分析: 我们可以在最外边加一圈“空气”,然后求空气的连通块的体积,最后用总体积减去即是雕塑的体积. 还有一个很“严重”的问题就是5003所占 ...
-
UVA 12171 (hdu 2771)sculptrue(离散化)
以前对离散化的理解不够,所以把端点和区间区分来考虑但是做完这题以后有了新的认识: 先来看一个问题:给你以下的网格,你需要多少空间去存储红点区间的信息呢? 只需要图上所示的1,2,3,4个点就足够表示红 ...
-
hdu 2771(uva 12171) Sculpture bfs+离散化
题意: 给出一些边平行于坐标轴的长方体,这些长方体可能相交.也可能相互嵌套.这些长方体形成了一个雕塑,求这个雕塑的整体积和表面积. 题解: 最easy想到直接进行bfs或者dfs统计,但此题的麻烦之处 ...
-
Uva 12171 Sculpture - 离散化 + floodfill
题目连接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
-
UVA 12171 Sculpture
https://vjudge.net/problem/UVA-12171 题目 某人设计雕塑,用的是很扯的方法:把一堆长方体拼起来.给出长方体的坐标和长宽高,求外表面积.因为要将这雕塑进行酸洗,需要知 ...
-
UVA 10816 + HDU 1839 Dijstra + 二分 (待研究)
UVA 题意:两个绿洲之间是沙漠,沙漠的温度不同,告诉起点,终点,求使得从起点到终点的最高温度最小的路径,如果有多条,输出长度最短的路径: 思路:用最小费用(最短路径)最大流(最小温度)也能搞吧,但因 ...
-
Uva 10007 / HDU 1131 - Count the Trees (卡特兰数)
Count the Trees Another common social inability is known as ACM (Abnormally Compulsive Meditation) ...
-
uva 215 hdu 1455 uvalive5522 poj 1011 sticks
//这题又折腾了两天 心好累 //poj.hdu数据极弱,找虐请上uvalive 题意:给出n个数,将其分为任意份,每份里的数字和为同一个值.求每份里数字和可能的最小值. 解法:dfs+剪枝 1.按降 ...
-
uva 437 hdu 1069
dp 将石块按三个面存入队列 按底面积排序 dp就最大高度 按嵌套矩形最长路做做法 #include <iostream> #include <cstdio> #inc ...
随机推荐
-
CQRS FAQ (翻译)
我从接触ddd到学习cqrs有6年多了, 其中也遇到了不少疑问, 也向很多的前辈牛人请教得到了很多宝贵的意见和建议. 偶尔的机会看到国外有个站点专门罗列了ddd, cqrs和事件溯源的常见问题. 其中 ...
-
Android 四大护法之一 Service
1.Service的概念 Service是Android 四大组件之一,是默认没有界面的运行于后台的服务程序.Service的开启方式分为启动式服务(startService)和绑定式服务(bindS ...
-
Oracle 使用小计(4)
1.oracle字符串分割函数split )定义split_type类型: CREATE OR REPLACE TYPE split_type IS TABLE OF VARCHAR2 (4000) ...
-
Spring Boot中使用Swagger2构建强大的RESTful API文档
由于Spring Boot能够快速开发.便捷部署等特性,相信有很大一部分Spring Boot的用户会用来构建RESTful API.而我们构建RESTful API的目的通常都是由于多终端的原因,这 ...
-
mysql的REGEXP 和like的详细研究和解释
1 regexp ^ 匹配字符串的开始部分 $ 匹配字符串的结束部分 . 匹配任何字符(包括回车和新行) a* 匹配0或多个a字符的任何序列 a+ 匹配1个或多个a字符的任何序列 a? 匹配0个或1个 ...
-
Codewars编辑题--今天升到了7段
今天做的题目是:写一个函数toWeirdCase(),对给定的一个字符串string进行偶数位(包括0)变成大写的操作,字符串string分为单个单词的字符串和多个单词组成的句子.效果应该是这个样子滴 ...
-
php观察者模式
观察者模式(有时又被称为发布/订阅模式)是软件设计模式的一种.在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知.这通常透过呼叫各观察者所提供的方法来实现.此 ...
-
EXCLE 导入 或 导出
首先要引用 NPOI.dll (可在网上下载!)//导入public void OnSubmit() { string path = Server.MapPat ...
-
Spark学习笔记11面向对象编程
面向对象编程 11.1 object类 11.1.1定义一个简单的类 11.1.2 field的getter与setter 定义类包含,定义类的field及方法.其格式如下 class Cla ...
-
undo空间满的处理方法(含undo的学习与相关解释)
1.查看数据库当前实例使用的是哪个UNDO表空间: show parameter undo_tablespace 2.查看UNDO表空间对应的数据文件和大小 pages col file_name f ...