UVa12171 hdu2771 UVaLive4291 Sculpture

填坑系列(p.171)

orz rjl

代码基本和rjl的一样

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<cstdlib>
  4 #include<algorithm>
  5 #include<iostream>
  6
  7 template<typename Q> Q read(Q& x) {
  8     static char c, f;
  9     for(f = 0; c = getchar(), !isdigit(c); ) if(c == ‘-‘) f = 1;
 10     for(x = 0; isdigit(c); c = getchar()) x = x * 10 + c - ‘0‘;
 11     if(f) x = -x;
 12     return x;
 13 }
 14 template<typename Q> Q read() {
 15     static Q x; read(x); return x;
 16 }
 17
 18 const int maxn = 50 + 5, maxc = 1000 + 1;
 19 const int dx[] = {1, -1, 0, 0, 0, 0};
 20 const int dy[] = {0, 0, -1, 1, 0, 0};
 21 const int dz[] = {0, 0, 0, 0, -1, 1};
 22
 23 int n, x0[maxn], y0[maxn], z0[maxn], x1[maxn], y1[maxn], z1[maxn];
 24
 25 int nx, ny, nz;
 26 int xs[maxn*2], ys[maxn*2], zs[maxn*2];
 27 int color[maxn*2][maxn*2][maxn*2];
 28
 29 struct Cell {
 30     int x, y, z;
 31     Cell() {}
 32     Cell(int x, int y, int z) : x(x), y(y), z(z) {}
 33     bool valid() const {
 34         return x >= 0 && x < nx - 1 && y >= 0 && y < ny - 1 && z >= 0 && z < nz - 1;
 35     }
 36     bool solid() const {
 37         return color[x][y][z] == 1;
 38     }
 39     bool getvis() const {
 40         return color[x][y][z] == 2;
 41     }
 42     void setvis() const {
 43         color[x][y][z] = 2;
 44     }
 45     int volume() const {
 46         return (xs[x+1] - xs[x]) * (ys[y+1] - ys[y]) * (zs[z+1] - zs[z]);
 47     }
 48     Cell neighbor(int dir) const {
 49         return Cell(x + dx[dir], y + dy[dir], z + dz[dir]);
 50     }
 51     int area(int dir) const {
 52         if(dx[dir]) return (ys[y+1] - ys[y]) * (zs[z+1] - zs[z]);
 53         if(dy[dir]) return (xs[x+1] - xs[x]) * (zs[z+1] - zs[z]);
 54         return (xs[x+1] - xs[x]) * (ys[y+1] - ys[y]);
 55     }
 56 };
 57
 58 void discretize(int *s, int& n) {
 59     std::sort(s, s + n);
 60     n = std::unique(s, s + n) - s;
 61 }
 62
 63 int ID(int *s, int n, int x) {
 64     return std::lower_bound(s, s + n, x) - s;
 65 }
 66
 67 #include<queue>
 68 void floodfill(int &v, int &s) {
 69     v = 0, s = 0;
 70     Cell c(0, 0, 0);
 71     c.setvis();
 72     std::queue<Cell> q;
 73     q.push(c);
 74     while(!q.empty()) {
 75         Cell c = q.front(); q.pop();
 76         v += c.volume();
 77         for(int i = 0; i < 6; i++) {
 78             Cell c2 = c.neighbor(i);
 79             if(!c2.valid()) continue;
 80             if(c2.solid()) s += c.area(i);
 81             else if(!c2.getvis()) {
 82                 c2.setvis();
 83                 q.push(c2);
 84             }
 85         }
 86     }
 87     v = maxc * maxc * maxc - v;
 88 }
 89
 90 int main() {
 91 #ifdef DEBUG
 92     freopen("in.txt", "r", stdin);
 93     freopen("out.txt", "w", stdout);
 94 #endif
 95
 96     int T; scanf("%d", &T);
 97     while(T--) {
 98         nx = ny = nz = 2;
 99         xs[0] = ys[0] = zs[0] = 0;
100         xs[1] = ys[1] = zs[1] = maxc;
101         scanf("%d", &n);
102         for(int i = 0; i < n; i++) {
103             scanf("%d%d%d%d%d%d", &x0[i], &y0[i], &z0[i], &x1[i], &y1[i], &z1[i]);
104             x1[i] += x0[i]; y1[i] += y0[i]; z1[i] += z0[i];
105             xs[nx++] = x0[i]; xs[nx++] = x1[i];
106             ys[ny++] = y0[i]; ys[ny++] = y1[i];
107             zs[nz++] = z0[i]; zs[nz++] = z1[i];
108         }
109         discretize(xs, nx);
110         discretize(ys, ny);
111         discretize(zs, nz);
112
113         memset(color, 0, sizeof color);
114         for(int i = 0; i < n; i++) {
115             int X1 = ID(xs, nx, x0[i]), X2 = ID(xs, nx, x1[i]);
116             int Y1 = ID(ys, ny, y0[i]), Y2 = ID(ys, ny, y1[i]);
117             int Z1 = ID(zs, nz, z0[i]), Z2 = ID(zs, nz, z1[i]);
118             for(int X = X1; X < X2; X++) for(int Y = Y1; Y < Y2; Y++)
119                 for(int Z = Z1; Z < Z2; Z++) color[X][Y][Z] = 1;
120         }
121         int v, s;
122         floodfill(v, s);
123         printf("%d %d\n", s, v);
124     }
125     return 0;
126 }

时间: 2024-12-05 09:54:58

UVa12171 hdu2771 UVaLive4291 Sculpture的相关文章

aoapc第六章 R题 Sculpture

aoapc第六章 R题 Sculpture http://7xjob4.com1.z0.glb.clouddn.com/5e3271c0195996a70363138f9cb82dd5 Imagine a box, made of copper plate. Imagine a second one, intersecting the rst one, and several others, intersecting each other (or not). That is how the sc

UVa 12171 (离散化 floodfill) Sculpture

题意: 三维空间中有n个长方体组成的雕塑,求表面积和体积. 分析: 我们可以在最外边加一圈“空气”,然后求空气的连通块的体积,最后用总体积减去即是雕塑的体积. 还有一个很“严重”的问题就是5003所占的空间太大,因此需要离散化.而在计算体积和表面积的时候要用原坐标. 离散化以后的坐标分别保存在xs.ys.zs,坐标为(x, y, z)的格子代表([xs[x], ys[y], zs[z]) ~ (xs[x+1], ys[y+1], zs[z+1]) 这一个小长方体. 这个题的难度对我来说属于大概思

uva 12171 hdu 1771 Sculpture

//这题从十一点开始写了四十分钟 然后差错一小时+ 要吐了 这题题意是给很多矩形的左下角(x,y,z最小的那个角)和三边的长(不是x,y,z最大的那个角T-T),为组成图形的面积与表面积(包在内部的之算体积不算表面积) 解法:离散化+bfs,先把范围扩大(相当于在周围加上空气),然后bfs,遇到表面积直接加入,遇到非长方体的部分也直接加入,最后用总体积减去空气的体积,这样就可以把内部的体积计算进来而不计算其表面积.因为坐标范围比较大,要先离散化. //其实我对这题一直耿耿于怀,当年没进省队多少与

UVa Sculpture(离散化 floodfill)

题意: 给定n个立方体的一个顶点坐标和3边长度,  问这些立方体组成的雕塑的表面积和体积,   坐标都是整数,n最大为50,  最大为500, 边长最大也是500. 分析: 继UVa221后又一道离散化 首先先深入理解一下离散化: (转自 http://www.cnblogs.com/jerryRey/p/4599388.html) 先来看一个问题:给你以下的网格,你需要多少空间去存储红点区间的信息呢? 只需要图上所示的1,2,3,4个点就足够表示红点所在区间了,为什么不是一个区间的第一个红点和

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

题意: 给出一些边平行于坐标轴的长方体,这些长方体可能相交.也可能相互嵌套.这些长方体形成了一个雕塑,求这个雕塑的整体积和表面积. 题解: 最easy想到直接进行bfs或者dfs统计,但此题的麻烦之处在于求整个雕塑的外表面积和雕塑内部可能出现四个长方体所搭成的空心.空心不能计算到表面积中,可是计算整体积却要计入,于是直接bfs或者dfs不优点理.于是,能够想到直接统计整个雕塑外围的全部小方块.就可以非常方便地求出雕塑地表面积和体积(雕塑地整体积==整个空间地体积-外围想方块的体积),另一点就是因

uva12171 离散化

区间离散化,将1000*1000*1000缩小为最多100*100*100的空间,进行bfs; #include <cstdio> #include <string> #include <iostream> #include <cstring> #include <set> #include <cmath> #include <algorithm> #define LL long long #include <map

繁华模拟赛 ljw分雕塑

/* 用f[i][k]表示考虑到第i个雕塑,分成k组,可不可行(这是一个bool类型的数组) 转移: f[i][k]=f[j][k-1],sum[i]-sum[j]合法 */ #include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> using namespace std; typedef long long ll; const int max_n = 2010;

根据76大细分词性对单词进行归组(二)

词性的重要性不言而喻,尤其是对于自然语言处理来说,哪怕就是记单词,根据词性对单词进行归组也是非常有帮助的. superword是一个Java实现的英文单词分析软件,主要研究英语单词音近形似转化规律.前缀后缀规律.词之间的相似性规律等等. 各大词性及其包括的词: 32.N-COUNT-COLL(可数集合名词) (词数:50) 1 aristocracy army array audience band 2 cast chapter command commission committee 3 co

Mobile Push Notification

In one embodiment, a method includes sending to a mobile client computing device a first notification through a real-time push service, the first notification including content and being associated with a stateful object; the method also includes, in