Get The Treasury

http://acm.hdu.edu.cn/showproblem.php?pid=3642

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Problem Description
Jack knows that there is a great underground treasury
in a secret region. And he has a special device that can be used to detect
treasury under the surface of the earth. One day he got outside with the device
to ascertain the treasury. He chose many different locations on the surface of
the earth near the secret region. And at each spot he used the device to detect
treasury and got some data from it representing a region, which may contain
treasury below the surface. The data from the device at each spot is six
integers x1, y1, z1, x2,
y2 and z2 (x1<x2,
y1<y2, z1<z2). According to
the instruction of the device they represent the range of x, y and z coordinates
of the region. That is to say, the x coordinate of the region, which may contain
treasury, ranges from x1 to x2. So do y and z coordinates.
The origin of the coordinates is a fixed point under the ground.
Jack can’t
get the total volume of the treasury because these regions don’t always contain
treasury. Through years of experience, he discovers that if a region is detected
that may have treasury at more than two different spots, the region really exist
treasure. And now Jack only wants to know the minimum volume of the
treasury.
Now Jack entrusts the problem to you.

 
Input
The first line of the input file contains a single
integer t, the number of test cases, followed by the input data for each test
case.
Each test case is given in some lines. In the first line there is an
integer n (1 ≤ n ≤ 1000), the number of spots on the surface of the earth that
he had detected. Then n lines follow, every line contains six integers
x1, y1, z1, x2, y2 and
z2, separated by a space. The absolute value of x and y coordinates
of the vertices is no more than 106, and that of z coordinate is no
more than 500.

 
Output
For each test case, you should output “Case a: b” in a
single line. a is the case number, and b is the minimum volume of treasury. The
case number is counted from one.
 
Sample Input
2
1
0 0 0 5 6 4
3
0 0 0 5 5 5
3 3 3 9 10 11
3 3 3 13 20 45
 
Sample Output
Case 1: 0
Case 2: 8
 
Source
 
Recommend
lcy   |   We have carefully selected several similar
problems for you:  2871 3308 3641 3397 1540 
 
题意:求n个长方体至少相交3次的体积和
z这一维只有500,所以枚举z轴,然后就相当于二维的扫描线
线段树维护区间完全覆盖1、2、3次的长度
 
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
#define N 1001
#define lc k<<1,l,mid
#define rc k<<1|1,mid+1,r
struct node
{
int l,r,h,f;
bool operator < (node p)const
{
return h<p.h;
}
}a[N<<];
struct edge
{
int x,xx,y,yy,z,zz;
}b[N];
int sum1[N<<],sum2[N<<],sum3[N<<],f[N<<],has[N<<],has2[N<<];
long long ans;
int n,cnt,opl,opr,w;
void up(int k,int l,int r)
{
if(f[k]>=) sum3[k]=has2[r+]-has2[l];
else if(f[k]==)
{
sum3[k]=sum1[k<<]+sum1[k<<|];
sum2[k]=has2[r+]-has2[l];
}
else if(f[k]==)
{
sum3[k]=sum2[k<<]+sum2[k<<|];
sum2[k]=sum1[k<<]+sum1[k<<|];
sum1[k]=has2[r+]-has2[l];
}
else
{
sum3[k]=sum3[k<<]+sum3[k<<|];
sum2[k]=sum2[k<<]+sum2[k<<|];
sum1[k]=sum1[k<<]+sum1[k<<|];
}
}
void change(int k,int l,int r)
{
if(opl<=l && r<=opr)
{
f[k]+=w;
up(k,l,r);
return;
}
int mid=l+r>>;
if(opl<=mid) change(lc);
if(opr>mid) change(rc);
up(k,l,r);
}
int main()
{
int T;
scanf("%d",&T);
for(int t=;t<=T;t++)
{
ans=;
cnt=;
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d%d%d%d%d%d",&b[i].x,&b[i].y,&b[i].z,&b[i].xx,&b[i].yy,&b[i].zz);
has[i*-]=b[i].z; has[i*]=b[i].zz;
}
sort(has+,has+*n+);
cnt=unique(has+,has+*n+)-(has+);
for(int i=;i<cnt;i++)
{
int sz=;
for(int j=;j<=n;j++)
if(b[j].z<=has[i] && b[j].zz>=has[i+])
{
a[++sz].l=b[j].x; a[sz].r=b[j].xx; a[sz].h=b[j].y; a[sz].f=;
a[++sz].l=b[j].x; a[sz].r=b[j].xx; a[sz].h=b[j].yy; a[sz].f=-;
has2[sz-]=b[j].x; has2[sz]=b[j].xx;
}
sort(has2+,has2+sz+);
int m=unique(has2+,has2+sz+)-(has2+);
sort(a+,a+sz+);
memset(sum1,,sizeof(sum1));
memset(sum2,,sizeof(sum2));
memset(sum3,,sizeof(sum3));
for(int j=;j<=sz;j++)
{
opl=lower_bound(has2+,has2+m+,a[j].l)-has2;
opr=lower_bound(has2+,has2+m+,a[j].r)-has2-;
w=a[j].f;
change(,,m);
ans+=1ll*sum3[]*(a[j+].h-a[j].h)*(has[i+]-has[i]);
}
}
printf("Case %d: %I64d\n",t,ans);
}
}
 

hdu 3642 Get The Treasury的更多相关文章

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

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

  2. HDU 3642 - Get The Treasury - [加强版扫描线+线段树]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3642 Time Limit: 10000/5000 MS (Java/Others) Memory L ...

  3. HDU 3642 Get The Treasury (线段树扫描线)

    题意:给你一些长方体,问你覆盖三次及以上的体积有多大 首先我们观察x轴y轴一样很大,但是z轴很小,所以我们可以枚举z轴(-500,500),注意我们枚举的是每一段长度为一的z轴的xy轴的面积而不是点. ...

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

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

  5. HDU 3642 Get The Treasury 线段树+分层扫描线

    http://www.acmerblog.com/hdu-3642-get-the-treasury-6603.html 学习:三维就是把竖坐标离散化分层,每一层进行线段树二维面积并就好了

  6. hdu 3642 Get The Treasury (三维的扫描线)

    题目大意: 给出N个立方体. 求一个三维空间中被包围三次的空间的体积之和. 思路分析: 发现Z的范围非常小.那么我们能够枚举Z轴,然后对 x y做扫描线. 并且不用枚举全部的Z ,仅仅须要将Z离散化之 ...

  7. HDU - 3642 Get The Treasury(线段树求体积交)

    https://cn.vjudge.net/problem/HDU-3642 题意 求立方体相交至少3次的体积. 分析 三维的呢..首先解决至少覆盖三次的问题.则用三个标记,更新时的细节要注意. 注意 ...

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

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

  9. Q - Get The Treasury - HDU 3642 (扫面线求体积)

    题意:求被三个或三个以上立方体重合的体积 分析:就是平面面积的加强,不过归根还是一样的,可以把z轴按照从小向大分区间N个,然后可以得到N个平面,用平面重复三次以上的在和高度计算体积. ******** ...

随机推荐

  1. 白话讲述Java中volatile关键字

    一.由一段代码引出的问题 首先我们先来看这样一段代码: public class VolatileThread implements Runnable{ private boolean flag = ...

  2. 在C#的控制台应用中使用Dapper链接MySQL并执行一些增删改查

    一.首先先创建一个C#的控制台应用 二.然后添加上必要的命名空间 using System;using System.Collections.Generic;using MySql.Data.MySq ...

  3. 2014NOIP普及组 子矩阵

    觉得题目水的离开 觉得普及组垃圾的请离开 不知道 DFS 和 DP 的请离开 不屑的大佬请离开 ……. 感谢您贡献的访问量 ————————————————华丽的分割线 ——————————————— ...

  4. idea Artifact mdn:war exploded: Server is not connected. Deploy is not available.

    idea 启动tomcat报的错误,启动tomcat无效 看了网上的好几种说发 说删除tomcat/bin/catalina.bat  里的JAVA_OPTS= -Xms512M -Xmx512M - ...

  5. JavaScript 再谈闭包

    之前有整理过一版关于闭包的概念,但感觉思路不是很清晰,是临时想起一些例子来讲的,今天再次来讲一下闭包. 闭包: 函数嵌套函数,内部函数可以引用外部函数的参数和变量 function aaa(a){ v ...

  6. NancyFX 附录: Nuget程序包

    Nancy.Authentication.Forms 该程序包向Nancy提供标准的基于ASP.NET/IIS的表单身份验证服务. 采用这个模块启用身份验证后,可以获得标准ASP.NET表单验证方式. ...

  7. Nginx实现集群的负载均衡配置过程详解

    Nginx 的负载均衡功能,其实实际上和 nginx 的代理是同一个功能,只是把代理一台机器改为多台机器而已. Nginx 的负载均衡和 lvs 相比,nginx属于更高级的应用层,不牵扯到 ip 和 ...

  8. Redis分布式锁的正确实现方式

    前言 分布式锁一般有三种实现方式:1. 数据库乐观锁:2. 基于Redis的分布式锁:3. 基于ZooKeeper的分布式锁.本篇博客将介绍第二种方式,基于Redis实现分布式锁.虽然网上已经有各种介 ...

  9. three.js 实现全景以及优化(2)

    继昨天全景实现后,再做了一个全景图切换实验; code:https://github.com/Thinkia/threejs_/blob/master/test/test1-panorama/inde ...

  10. c++ --> 重载、重写(覆盖)和隐藏的区别

    重载.重写(覆盖)和隐藏的区别 一.重载 重载从overload翻译过来,是指同一可访问区内被声明的几个具有不同参数列(参数的类型,个数,顺序不同)的同名函数,根据参数列表确定调用哪个函数,重载不关心 ...