http://www.cnblogs.com/kane0526/archive/2013/03/06/2947118.html

题目大意:给你n个立方体,求相交区域大于等于三次的体积和。

这题需要前面两题的知识

体积并

http://www.cnblogs.com/qlky/p/5759481.html

面积交:

http://www.cnblogs.com/qlky/p/5765617.html

对于面积交,另外建立len2数组表示覆盖2次的面积,len3数组表示覆盖3次及以上的面积

对于体积并,离散化x坐标是为了建树,离散化z坐标是为了节省时间。对于所有的体积范围进行面积交之和即为所求体积

#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <stack>
#include <queue>
#include <cctype>
#include <vector>
#include <iterator>
#include <set>
#include <map>
#include <sstream>
using namespace std; #define mem(a,b) memset(a,b,sizeof(a))
#define pf printf
#define sf scanf
#define spf sprintf
#define pb push_back
#define debug printf("!\n")
#define MAXN 2000+5
#define MAX(a,b) a>b?a:b
#define blank pf("\n")
#define LL long long
#define ALL(x) x.begin(),x.end()
#define INS(x) inserter(x,x.begin())
#define pqueue priority_queue
#define INF 0x3f3f3f3f #define ls (rt<<1)
#define rs (rt<<1|1) int n,m; int hh[MAXN],hh2[MAXN],col[MAXN<<],len[MAXN<<],len2[MAXN<<],len3[MAXN<<]; struct node
{
int l,r,x,c;
int z1,z2;
node(){}
node(int a,int b,int c,int d,int e,int f):l(a),r(b),x(c),c(d),z1(e),z2(f){}
bool operator < (const node &b) const
{
return x<b.x;
}
}a[MAXN<<],tmp[MAXN<<]; void PushUp(int rt,int l,int r)
{
if(col[rt]>=)
{
len[rt] = len2[rt] = len3[rt] = hh[r+] - hh[l];
}
else if(col[rt] == )
{
len[rt] = len2[rt] = hh[r+] - hh[l];
if(l==r) len3[rt] = ;
else len3[rt] = len[ls]+len[rs];
}
else if(col[rt] == )
{
len[rt] = hh[r+] - hh[l];
if(l==r) len2[rt] = len3[rt] = ;
else
{
len2[rt] = len[ls]+len[rs];
len3[rt] = len2[ls]+len2[rs];
}
}
else if(l==r) len[rt] = len2[rt] = len3[rt] = ;
else
{
len[rt] = len[ls]+len[rs];
len2[rt] = len2[ls]+len2[rs];
len3[rt] = len3[ls]+len3[rs];
}
} void update(int val,int L,int R,int l,int r,int rt)
{
if(L<=l && r<=R)
{
col[rt] += val;
PushUp(rt,l,r);
return;
}
int mid = (l+r)>>;
if(L <= mid) update(val,L,R,l,mid,ls);
if(R > mid) update(val,L,R,mid+,r,rs);
PushUp(rt,l,r);
} int main()
{
int n,i,j,t,kase=;
sf("%d",&t);
while(t--)
{
int v=;
sf("%d",&n);
LL ans = ;
for(i=;i<=n;i++)
{
int x1,x2,y1,y2;
int z1,z2;
sf("%d%d%d%d%d%d",&x1,&y1,&z1,&x2,&y2,&z2);
hh[++v]=y1;
hh2[v]=z1;
a[v]=node(y1,y2,x1,,z1,z2);
hh[++v]=y2;
hh2[v]=z2;
a[v]=node(y1,y2,x2,-,z1,z2);
}
sort(hh+,hh++v);
sort(hh2+,hh2++v);
sort(a+,a++v);
int d=,d2=;
for(i=;i<=v;i++)
if(hh[i]!=hh[i-])
hh[++d]=hh[i];
for(i=;i<=v;i++)
if(hh2[i]!=hh2[i-])
hh2[++d2]=hh2[i];
int ct =;
for(j=;j<=d2-;j++)
{
ct=;
for(i=;i<=v;i++)
if(a[i].z1<=hh2[j] && hh2[j]< a[i].z2)
tmp[ct++]=a[i];
mem(col,);
mem(len,);
mem(len2,);
mem(len3,);
for(i=;i<ct-;i++)
{
int l = lower_bound(hh+,hh+d,tmp[i].l)-hh;
int r = lower_bound(hh+,hh+d,tmp[i].r)-hh-;
if(l<=r) update(tmp[i].c,l,r,,d,);
//pf("t%d %d %d %d %d\n",len3[1],hh2[j+1],hh2[j],tmp[i+1].x,tmp[i].x);
ans+=(LL)len3[]*(LL)(hh2[j+]-hh2[j])*(tmp[i+].x-tmp[i].x);
//pf("t%d\n",len3[1]);
}
}
pf("Case %d: %I64d\n",kase++,ans);
}
return ;
}

hdu 3642 覆盖3次以上体积的更多相关文章

  1. Get The Treasury HDU - 3642(体积扫描线)

    给出n个立方体,要你求这些立方体至少被覆盖三次的部分. 先把这个立方体的信息存在来,发现Z的范围不大,z范围是是[-500,500],所以我们可以先离散化,然后枚举Z, 然后对于每一段Z的区域内,在当 ...

  2. hdu 3642 Get The Treasury(扫描线)

    pid=3642" style="">题目链接:hdu 3642 Get The Treasury 题目大意:三维坐标系,给定若干的长方体,问说有多少位置被覆盖3次 ...

  3. hdu 1255 覆盖的面积(线段树 面积 交) (待整理)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 Description 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积.   In ...

  4. HDU 3642 Get The Treasury (线段树扫描线,求体积并)

    参考链接 : http://blog.csdn.net/zxy_snow/article/details/6870127 题意:给你n个立方体,求覆盖三次以上(包括三次)的区域的体积 思路:先将z坐标 ...

  5. hdu 1255 覆盖的面积(求覆盖至少两次以上的面积)

    了校赛,还有什么途径可以申请加入ACM校队?  覆盖的面积 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K ...

  6. HDU - 1255 覆盖的面积(线段树求矩形面积交 扫描线+离散化)

    链接:线段树求矩形面积并 扫描线+离散化 1.给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. 2.看完线段树求矩形面积并 的方法后,再看这题,求的是矩形面积交,类同. 求面积时,用被覆 ...

  7. HDU 3642 Get The Treasury ( 线段树 求长方体体积并 )

    求覆盖三次及其以上的长方体体积并. 这题跟 http://wenku.baidu.com/view/d6f309eb81c758f5f61f6722.html 这里讲的长方体体积并并不一样. 因为本题 ...

  8. HDU 3642 扫描线(立方体体积并)

    Get The Treasury Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  9. hdu 3642 体积并

    题意:求三个矩形体积的并 链接:点我 枚举z #include<stdio.h> #include<iostream> #include<stdlib.h> #in ...

随机推荐

  1. spring 学习(五):spring 事务

    spring 学习(五):spring 事务 事务概要 一个数据库事务通常包含了一个序列的对数据库的读/写操作.它的存在包含有以下两个目的: 为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同 ...

  2. Django 使用第三方服务发送电子邮件

    在 Django 网站中使用 mailgun 的邮件收发服务. 1.在 mailgun 官网上注册个账号(免费,免费账号每个月有10000条收发邮件的服务,对我来说已经完全够用了),注册完成后界面如图 ...

  3. 洛谷P3254 圆桌问题(最大流)

    传送门 一道良心啊……没那么多麻烦了…… 从$S$向所有单位连边,容量为单位人数,从所有桌子向$T$连边,容量为桌子能坐的人数,从每一个单位向所有桌子连边,容量为$1$,然后跑一个最大流,看一看$S$ ...

  4. Octave安装符号工具箱

    1.国内访问Octave的代码包不稳定,可以访问网址http://sourceforge.mirrorservice.org/o/oc/octave/Octave%20Forge%20Packages ...

  5. zTree学习笔记

    一.zTree的下载 官网:http://www.treejs.cn/v3/main.php#_zTreeInfo 解压后的目录结构为: 二.zTree入门案例 2.1 在页面中引入相关文件 要使用z ...

  6. 瀑布模型,(增量开发)渐增式开发,原型化开发,统一过程模型(RUP)

    瀑布模型:设计在开发阶段 瀑布模型有以下优点 1)为项目提供了按阶段划分的检查点. 2)当前一阶段完成后,您只需要去关注后续阶段. 3)可在迭代模型中应用瀑布模型. 增量迭代应用于瀑布模型.迭代1解决 ...

  7. linux中tr的功能多多

    功能 通过使用 tr,您可以非常容易地实现 sed 的许多最基本功能. 您可以将 tr 看作为 sed 的(极其)简化的变体:它可以用一个字符来替换另一个字符,或者可以完全除去一些字符.您也可以用它来 ...

  8. adb自救指南

    以下只能自救专用 adb.exe root adb remount adb.exe connect <Ip> adb.exe install [-r] [-d] <apkPath&g ...

  9. 112th LeetCode Weekly Contest Validate Stack Sequences

    Given two sequences pushed and popped with distinct values, return true if and only if this could ha ...

  10. PIE SDK地图书签

    地图书签,可以理解为暂时记录当前地图的范围和放大级别,在后续的操作中如果想回到地图之前的状态,就可以点击保存的书签就可以回到此状态,如图所示: 地图刚加载的时候是一幅世界地图 我们将地图的中心拖到南美 ...