hdu 3642 覆盖3次以上体积
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次以上体积的更多相关文章
- Get The Treasury HDU - 3642(体积扫描线)
给出n个立方体,要你求这些立方体至少被覆盖三次的部分. 先把这个立方体的信息存在来,发现Z的范围不大,z范围是是[-500,500],所以我们可以先离散化,然后枚举Z, 然后对于每一段Z的区域内,在当 ...
- hdu 3642 Get The Treasury(扫描线)
pid=3642" style="">题目链接:hdu 3642 Get The Treasury 题目大意:三维坐标系,给定若干的长方体,问说有多少位置被覆盖3次 ...
- hdu 1255 覆盖的面积(线段树 面积 交) (待整理)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 Description 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. In ...
- HDU 3642 Get The Treasury (线段树扫描线,求体积并)
参考链接 : http://blog.csdn.net/zxy_snow/article/details/6870127 题意:给你n个立方体,求覆盖三次以上(包括三次)的区域的体积 思路:先将z坐标 ...
- hdu 1255 覆盖的面积(求覆盖至少两次以上的面积)
了校赛,还有什么途径可以申请加入ACM校队? 覆盖的面积 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K ...
- HDU - 1255 覆盖的面积(线段树求矩形面积交 扫描线+离散化)
链接:线段树求矩形面积并 扫描线+离散化 1.给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. 2.看完线段树求矩形面积并 的方法后,再看这题,求的是矩形面积交,类同. 求面积时,用被覆 ...
- HDU 3642 Get The Treasury ( 线段树 求长方体体积并 )
求覆盖三次及其以上的长方体体积并. 这题跟 http://wenku.baidu.com/view/d6f309eb81c758f5f61f6722.html 这里讲的长方体体积并并不一样. 因为本题 ...
- HDU 3642 扫描线(立方体体积并)
Get The Treasury Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- hdu 3642 体积并
题意:求三个矩形体积的并 链接:点我 枚举z #include<stdio.h> #include<iostream> #include<stdlib.h> #in ...
随机推荐
- 【guava】前提条件
guava为编写漂亮代码提供了很大的便利,今天,我想向你展示下我是怎么使用预判断来避免不必要的if/throw 申明,使用选择来提升代码逻辑性. 预判断并不是新东西,Apache Commons项目有 ...
- 详说Flask、Django、Pyramid三大主流 Web 框架
前言 目前随着 Python 在大数据.云计算.人工智能方面的热度,Python Web 应该也会被更多企业了解使用. Python Web 框架千万种,没必要都去了解和学习,身边总有人说高手都用 F ...
- Udp -内部缓冲区
1.每个socket关联了两个缓冲区,一个用于发送,一个用于接收. 2. 3.发送:(1)sendto()把数据放在sendbuf(缓冲区),通知os来取 (2)os在适当的时候过来取数据,并发到网络 ...
- Python3之os模块
一:简介 os模块主要用于提供系统高级别的操作. 二:常用方法 os.access(path, mode) # 检验权限模式 os.chdir(path) # 改变当前工作目录 os.chflags( ...
- 条目十二《切勿对slt容器的线性安全性又不切实际的依赖》
条目十二<切勿对slt容器的线性安全性又不切实际的依赖> 这一条目,我想用简短而有力的语句来总结. stl库是为了照顾大多数情况,而不是某一领域,如果在库层次实现线性安全,很大可能是对性能 ...
- iOS导入c++语言的静态库之后编译不过,先要检查是否导入了libstdc++
iOS项目中引入c++库,编译链接时报如下错: "std::string::_Rep::_M_destroy(std::allocator<char> const&)&q ...
- 5A - Matrix
#include <iostream> using namespace std; int n, m, q; struct node { int v; // 节点权值 int r; // 右 ...
- mysql的时区错误问题,The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one
在使用springboot整合ssm和druid的时候出现数据库一个问题 org.springframework.web.util.NestedServletException: Request pr ...
- 请设计实现一个商城系统开发v2.0【代码优化】
#!/usr/bin/env python 优化的部分:1.改用字典取键,来调用函数[原来是用if-else判断] [补充]:也可以用列表,按索引取,可以在列表最前面加一个“”任意元素,凑成一个.就和 ...
- 使用Swagger生成简单接口文档
使用swagger通过简单的配置可以生成简单的接口文档: 依赖包: // Swagger2 compile 'io.springfox:springfox-swagger2:2.8.0' compil ...