uva 12171 hdu 1771 Sculpture
//这题从十一点开始写了四十分钟 然后查错一小时+ 要吐了
这题题意是给很多矩形的左下角(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 ...
随机推荐
- 菜鸟的jQuery源码学习笔记(前言)
前言 相信任何一名前端开发人员或者是前端爱好者都对jQuery不陌生.jQuery简单易用,功能强大,特别是拥有良好的浏览器兼容性,大大降低了前端开发的难度,使得前端开发变得“平易近人起来”.自从本人 ...
- Python 入门之常见小问题
1.在终端运行python,出现>>>即可输入代码回车进行执行,如果要退出,只需要执行exit()即可. -->在Python交互式命令行下,可以直接输入代码,然后执行,并立刻 ...
- Git 操作常用命令
Git使用 1. git pull 更新服务器代码到本地a). git pull origin master是将origin这个版本库的代码更新到本地的master主分支 2. git push ...
- python---连接MySQL第三页
用python语言从MySQL中查询数据 #!conding:utf-8 from mysql.connector import errorcode import mysql.connector cn ...
- php中strstr、strrchr、substr、stristr四个函数用法区别
php中strstr.strrchr.substr.stristr四个函数用法区别: php中strstr strrchr substr stristr这四个字符串操作函数特别让人容易混淆,常用的是s ...
- Hadoop HA部署
因为公司旧系统的Hadoop版本是2.2,所以在部署新系统时使用了旧系统. 但是在部署ResourceManager auto failover时发现其他nodemanager总是向0.0.0.0请求 ...
- 用sql语句按周、按月、按季、按年统
原文地址:http://hi.baidu.com/%BD%F0%D3%F1kl_y/blog/item/1c368ffba9388476024f5645.html --按mySql语法统计按周,月,季 ...
- 全国计算机等级考试二级教程-C语言程序设计_第14章_结构体、共用体和用户定义类型
函数的返回值是结构体类型 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> struct ...
- strcpy()、memcpy()、memmove()、memset()的内部实现
一直想知道 strcpy().memcpy().memmove().memset()的内部实现 strcpy(), 字符串拷贝. char *strcpy(char *strDest, const c ...
- DEV控件之ChartControl用法
一.总体概述 这个控件包含3层,最外面的chartControl层.中间的XYDiagram层.最里面的Series层.功能非常强大,但同时使用起来也相对复杂,需要各个层之间相互协调设置才能达到自己想 ...