UVa12171 雕塑
来源:互联网 发布:双十一实时交易数据 编辑:程序博客网 时间:2024/04/28 09:25
题目大意我就不讲了= =
题解
由于内部有密闭空间所以直接在长方体内部BFS肯定不行,那么考虑在整个立方体周围套一个空气层(具体实现可以加上第0和第501行之类的)。通过对空气层进行BFS解决问题。
给每一个格子一个颜色,比如col[i][j][k]=1表示为空气,0表示未到过,2表示有长方体。然后沿着0去BFS,如果遇到2的话就一定是一个表面积的部分,加上即可,BFS过程中一个变量记录已经到过的体积,最后总体积减去统计的就是所求部分。
然后是离散化,500^3好像会T所以离散化一下(说着简单但是代码量好像特别大的样子)QAQ别怪我代码写得丑还用_之类的变量名。
代码
#include<queue>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#define rep(i,x,y) for(int i=x;i<=y;i++)using namespace std;const int maxn=50+10;const int maxm=500+10;const int dx[]= {-1,1,0,0,0,0};const int dy[]= {0,0,1,-1,0,0};const int dz[]= {0,0,0,0,1,-1};inline int read(){ int ret=0;char ch=getchar(); while(ch<='0'||ch>'9')ch=getchar(); for(;ch>='0'&&ch<='9';ch=getchar()) ret=ret*10+ch-'0'; return ret;}struct Node { int x0,y0,z0,dx,dy,dz; Node() {} Node(int x0,int y0,int z0,int dx,int dy,int dz): x0(x0),y0(y0),z0(z0),dx(dx),dy(dy),dz(dz) {} inline void input() { x0=read(); y0=read(); z0=read(); dx=read(); dy=read(); dz=read(); }}a[maxn];struct Array { //离散后->离散 int _[maxn*2],siz; Array() { memset(_,0,sizeof(_)); } inline void Sort(int n) { sort(_+1,_+2*n+1); } inline void Unique(int n) { siz=unique(_+1,_+2*n+1)-_-1; } inline void input(int i,int o0,int d0) { _[(i<<1)-1]=o0; _[i<<1]=o0+d0; }} x,y,z;struct NODE { int x,y,z; NODE() {} NODE(int x,int y,int z):x(x),y(y),z(z) {}};int n,sizex,sizey,sizez;int col[maxn*2][maxn*2][maxn*2];//0:empty 1:air 2:blockinline void ID(int *k,int v1,int v2,int &p1,int &p2,int sz) { p1=lower_bound(k+1,k+sz+1,v1)-k; p2=lower_bound(k+1,k+sz+1,v2)-k; return ;}inline int inside(int xx,int yy,int zz) { return xx>=0&&xx<=x.siz&&yy>=0&&yy<=y.siz&&zz>=0&&zz<=z.siz;}inline void BFS(int x1,int y1,int z1,int &biao,int &ti) { biao=ti=0; queue<NODE>q; q.push(NODE(x1,y1,z1)); col[x1][y1][z1]=1; while(!q.empty()) { NODE k=q.front(); q.pop(); int d=(::x._[k.x+1]-::x._[k.x])*(::y._[k.y+1]-::y._[k.y])*(::z._[k.z+1]-::z._[k.z]); ti=ti+d;// cnt++;printf("%d %d %d %d\n",k.x,k.y,k.z,d); int x=k.x,y=k.y,z=k.z; for(int i=0;i<6;i++) { int nx=x+dx[i],ny=y+dy[i],nz=z+dz[i]; if(inside(nx,ny,nz)) { if(!col[nx][ny][nz]) col[nx][ny][nz]=1,q.push(NODE(nx,ny,nz)); else if(col[nx][ny][nz]==2) { if(i==0||i==1) biao=biao+(::y._[ny+1]-::y._[ny])*(::z._[nz+1]-::z._[nz]); if(i==2||i==3) biao=biao+(::x._[nx+1]-::x._[nx])*(::z._[nz+1]-::z._[nz]); if(i==4||i==5) biao=biao+(::x._[nx+1]-::x._[nx])*(::y._[ny+1]-::y._[ny]); } } } } ti=(x._[x.siz]+1)*(y._[y.siz]+1)*(z._[z.siz]+1)-ti; return ;}inline void solve() { memset(col,0,sizeof(col)); cin>>n; for(int i=1; i<=n; i++) { a[i].input(); x.input(i,a[i].x0,a[i].dx); y.input(i,a[i].y0,a[i].dy); z.input(i,a[i].z0,a[i].dz); } x.Sort(n); y.Sort(n); z.Sort(n); x.Unique(n); y.Unique(n); z.Unique(n); x._[x.siz+1]=x._[x.siz]+1; y._[y.siz+1]=y._[y.siz]+1; z._[z.siz+1]=z._[z.siz]+1; for(int O_O=1; O_O<=n; O_O++) { int i1,i2,j1,j2,k1,k2; ID(x._,a[O_O].x0,a[O_O].x0+a[O_O].dx,i1,i2,x.siz); ID(y._,a[O_O].y0,a[O_O].y0+a[O_O].dy,j1,j2,y.siz); ID(z._,a[O_O].z0,a[O_O].z0+a[O_O].dz,k1,k2,z.siz); rep(i,i1,i2-1) rep(j,j1,j2-1) rep(k,k1,k2-1) col[i][j][k]=2; } int biao,ti; BFS(0,0,0,biao,ti); printf("%d %d\n",biao,ti);}int main() { int T; cin>>T; while(T--) solve(); return 0;}
1 0
- UVa12171 雕塑
- 例题6-18 雕塑 UVa12171
- 例题6-18 雕塑(Sculpture, ACM/ICPC NWERC 2008, UVa12171)
- UVa12171 Sculpture
- 离散化--uva12171 Sculpture
- 运雕塑 雕塑奥运
- 运雕塑 雕塑奥运
- “雕塑”起源
- UVa12171 Sculpture 离散化+搜索
- 照片:北京雕塑公园
- 用幽默雕塑智慧
- Graveyard(墓地雕塑)
- LA3708 Graveyard 墓地雕塑
- UVA-墓地雕塑
- graveyard,neerc(墓地雕塑)
- LA3708墓地雕塑
- LA3708 Graveyard 墓地雕塑
- 【NOIP2012模拟10.26】雕塑
- 在单向链表中如何快速查到倒数第n个节点 这简直是一种神奇的思路!!!!leetcode 删除倒数第n个节点
- ctr预估之特征工程
- Timer搭配TimerTask与Handler使用(更新UI)
- 正则总结 - 不完全深入版
- hibernate级联映射
- UVa12171 雕塑
- BZOJ_P2958/BZOJ_P3269 序列染色(动态规划+容斥原理)
- swift调用高端地图
- 别让安全问题拖慢了 DevOps!
- 关于flash的跨域问题
- 【Ionic入门】-Ionic简介
- java Map转换为实体类
- ZSOI2012 捡金子 字典树+树形DP
- lightoj-1122 - Digit Count dp