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 ...
随机推荐
- HDU6299-2018ACM暑假多校联合训练1002-Balanced Sequence
这个题的题意是给你n个字符串,认定()是一种平衡的串,两个以上连续的()()也是一种平衡的串,如果一对括号里面包含一个平衡的串,这个括号也被算在这个平衡的串之内, 如(()(()))是一个长度为8的平 ...
- np.random.seed(0)的作用:作用:使得随机数据可预测。
>>>> numpy.random.seed(0) ; numpy.random.rand(4) array([ 0.55, 0.72, 0.6 , 0.54]) > ...
- MyBatis与JDBC的对比
//JDBC的步骤,1.加载驱动.2.获取连接.3.执行sql语句.4.处理结果集.5.关闭资源 Class.forName("com.mysql.jdbc.Driver").ne ...
- WPF中MVVM模式下控件自有的事件绑定
1.原因 在WPF中单纯的命令绑定往往不能满足覆盖所有的事件,例如ComboBox的SelectionChanged事件,DataGrid的SelectionChanged事件等等,这时就可以用事件绑 ...
- java集合之Set接口
Set集合通常不能记住元素添加的顺序,其他的操作和它的父接口基本相同.只是行为上有细微的差别,Set集合不能包含相同的元素.如果尝试添加相同的元素,调用add()方法将返回false,且新元素不能被加 ...
- 25.Remove Nth Node From End of List(删除链表的倒数第n个节点)
Level: Medium 题目描述: Given a linked list, remove the n-th node from the end of list and return its ...
- P2057 [SHOI2007]善意的投票 (最大流)
题目 P2057 [SHOI2007]善意的投票 解析 网络流的建模都如此巧妙. 我们把同意的意见看做源点\(s\),不同意的意见看做汇点\(t\). 那我们\(s\)连向所有同意的人,\(t\)连向 ...
- Qt 学习之路 2(69):进程
Qt 学习之路 2(69):进程 豆子 2013年11月9日 Qt 学习之路 2 15条评论 进程是操作系统的基础之一.一个进程可以认为是一个正在执行的程序.我们可以把进程当做计算机运行时的一个基础单 ...
- Qt 学习之路 2(47):视图选择
Qt 学习之路 2(47):视图选择 豆子 2013年3月28日 Qt 学习之路 2 34条评论 选择是视图中常用的一个操作.在列表.树或者表格中,通过鼠标点击可以选中某一项,被选中项会变成高亮或者反 ...
- clustalX2使用以及相关的问题
Clustalx的操作 第一步:输入序列文件. 第二步:设定比对的一些参数. 参数设定窗口. 第三步:开始序列比对. 第四步:比对完成,选择保存结果文件的格式 相关问题 CLUSTALX-是CLUST ...