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 ...
随机推荐
- n阶行列式算法(c程序)
#include<stdio.h> #include<math.h> #define N 100 //N比输入的阶数大即可 int main() { int n,a[N][ ...
- docker加速器配置
我使用docker的原因 最近自己一直在强迫自己使用docker,一方面是docker的容器化服务,使得每一个配置相互独立,易于维护.而且如果到后面如果深入了的话,通过自己编写dockerfile,那 ...
- Qt 学习之路 2(57):可视化显示数据库数据
Qt 学习之路 2(57):可视化显示数据库数据(skip) 豆子 2013年6月26日 Qt 学习之路 2 26条评论 前面我们用了两个章节介绍了 Qt 提供的两种操作数据库的方法.显然,使用QSq ...
- angular-ui-select 下拉框支持过滤单选多选解决方案(系列一)
angular-ui-select 官方文档:github地址:https://github.com/angular-ui/ui-select 请大家多看文档 首先注意版本的问题,如果版本不 ...
- pycharm运行Pytest,有没有将Pytest写入Python代码中的区别
初学pytest. 将pytest写进Python代码中 不同运行方式都可正常运行 =======================**********************========= ...
- linux下的小命令
(1) 查看服务器的IP信息 ip add show ifconfig (2) 操作网卡命令(重启网络和启用网卡) cleasystemctl restart network systemctl st ...
- python学习之路---day23--模块
模块基本小结if __name__ == '__main__':一:import 引入模块模块:是一个包含python定义和声明的文件,文件名就是模块名字加上.py后缀,所有的py文件都可以看成是一个 ...
- 小Q系列故事——最佳裁判
Time Limit:200MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Description 过去的2012年 ...
- 洛谷 P3205 [HNOI2010]合唱队
题目链接 题解 区间dp \(f[i][j]\)表示i~j区间最后一次插入的是\(a[i]\) \(g[i][j]\)表示i~j区间最后一次插入的是\(a[j]\) 然后就是普通区间dp转移 Code ...
- bzoj3224 普通平衡树 splay模板
题目传送门 题目大意:完成一颗splay树. 思路:模板题,学着还是很有意思的. 学习splay树:蒟蒻yyb 该题模板:汪立超 #include<bits/stdc++.h> #defi ...