hdu3642扫描线 长方体
立方体交,自己写的莫名其妙MLE了,不知道为什么
- #include<iostream>
- #include<cstring>
- #include<cstdio>
- #include<algorithm>
- #define maxn 2010
- using namespace std;
- #define lson l,m,rt<<1
- #define rson m+1,r,rt<<1|1
- #define ll long long
- struct cube{
- int x1,y1,z1,x2,y2,z2;
- cube(){}
- cube(int a,int b,int c,int d,int e,int f):
- x1(a),y1(b),z1(c),x2(d),y2(e),z2(f){}
- }cubes[maxn];
- struct seg{//水平横线段
- int l,r,h,d;
- seg(){}
- seg(int l,int r,int h,int d):l(l),r(r),h(h),d(d){}
- bool operator<(const seg & a)const
- { return h<a.h; }
- }segs[maxn];
- int tots;
- int y[maxn],z[maxn],tot,toty,totz;//y轴,z轴上的数据
- int len1[maxn<<],len2[maxn<<],len3[maxn<<];//线段树区间被覆盖了1,2,3次的长度
- int cnt[maxn<<];//区间被完全覆盖的次数
- inline void pushup(int rt,int l,int r){
- if(cnt[rt]>=){
- len3[rt]=y[r+]-y[l];
- len2[rt]=len1[rt]=;
- }
- else if(cnt[rt]==){
- len1[rt]=;
- len2[rt]=y[r+]-y[l];
- if(l==r) len3[rt]=;//没有子区间的情况
- else {
- len3[rt]=len3[rt<<]+len3[rt<<|]+len2[rt<<]+len2[rt<<|]+len1[rt<<]+len1[rt<<|];
- len2[rt]-=len3[rt];
- }
- }
- else if(cnt[rt]==){
- len1[rt]=y[r+]-y[l];
- if(l==r) len3[rt]=len2[rt]=;//没有子区间的情况
- else {
- len3[rt]=len3[rt<<]+len3[rt<<|]+len2[rt<<]+len2[rt<<|];
- len2[rt]=len1[rt<<]+len1[rt<<|];
- len1[rt]-=len2[rt]+len3[rt];
- }
- }
- else {//cnt[rt]==0
- if(l==r) len3[rt]=len2[rt]=len1[rt]=;
- else {
- len3[rt]=len3[rt<<]+len3[rt<<|];
- len2[rt]=len2[rt<<]+len2[rt<<|];
- len1[rt]=len1[rt<<]+len1[rt<<|];
- }
- }
- }
- void update(int L,int R,int c,int l,int r,int rt){
- if(L<=l && R>=r){
- cnt[rt]+=c;
- pushup(rt,l,r);
- return;
- }
- int m=l+r>>;
- if(L<=m) update(L,R,c,lson);
- if(R>m) update(L,R,c,rson);
- pushup(rt,l,r);
- }
- void init(){
- tot=toty=totz=tots=;
- memset(y,,sizeof y);
- memset(z,,sizeof z);
- memset(len1,,sizeof len1);
- memset(len2,,sizeof len2);
- memset(len3,,sizeof len3);
- memset(cnt,,sizeof cnt);
- }
- int main(){
- int T,n;
- scanf("%d",&T);
- for(int tt=;tt<=T;tt++){
- init();
- scanf("%d",&n);
- for(int i=;i<=n;i++){
- int a,b,c,d,e,f;
- scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f);
- cubes[i]=cube(a,b,c,d,e,f);
- y[tot]=b;z[tot++]=c;
- y[tot]=e;z[tot++]=f;
- }
- if(n<) {puts("");continue;}
- sort(y,y+tot);toty=unique(y,y+tot)-y;
- sort(z,z+tot);totz=unique(z,z+tot)-z;
- ll res=;
- for(int i=;i<totz-;i++){
- tots=;
- for(int j=;j<=n;j++)
- if(cubes[j].z1<=z[i] && cubes[j].z2>=z[i+]){
- segs[tots++]=seg(cubes[j].x1,cubes[j].x2,cubes[j].y1,);
- segs[tots++]=seg(cubes[j].x1,cubes[j].x2,cubes[j].y2,-);
- }
- sort(segs,segs+tots);//将水平横线段排序
- for(int j=;j<tots;j++){//将这些边更新到线段树中
- if(j!=) res+=(z[i+]-z[i])*(segs[j].h-segs[j-].h)*len3[];
- int L=lower_bound(y,y+toty,segs[j].l)-y;
- int R=lower_bound(y,y+toty,segs[j].r)-y-;
- update(L,R,segs[j].d,,toty,);//为什么要计算在前更新在后?
- }
- }
- printf("%lld\n",res);
- }
- return ;
- }
kuangbin的板子是可以过的。。
hdu3642扫描线 长方体的更多相关文章
- HDU3642 Get The Treasury —— 求矩形交体积 线段树 + 扫描线 + 离散化
题目链接:https://vjudge.net/problem/HDU-3642 Jack knows that there is a great underground treasury in a ...
- hdu3642 Get The Treasury 线段树--扫描线
Jack knows that there is a great underground treasury in a secret region. And he has a special devic ...
- Get The Treasury【HDU-3642】【扫描线】
题目链接 题目给出的是N个体积块,问的是有多少体积重叠了3次及以上? 那么就是怎么处理体积这样子的问题了,看到Z的种类不多的时候,就想着从Z离散化的角度去考虑这个问题了,然后就是怎样子去处理面积了,这 ...
- 线段树总结 (转载 里面有扫描线类 还有NotOnlySuccess线段树大神的地址)
转载自:http://blog.csdn.net/shiqi_614/article/details/8228102 之前做了些线段树相关的题目,开学一段时间后,想着把它整理下,完成了大牛NotOnl ...
- hdu 3642 Get The Treasury(扫描线)
pid=3642" style="">题目链接:hdu 3642 Get The Treasury 题目大意:三维坐标系,给定若干的长方体,问说有多少位置被覆盖3次 ...
- hdu3255扫描线:带权面积交转体积交
手贱把i打成j,调了半天 /* 面积并转体积并,长方体高度为作物价格 算体积并:在笛卡尔坐标系的y轴上建立线段树cnt记录区间被完全覆盖的次数,sum记录区间被覆盖的总长度 以平行于xoy的平面从下往 ...
- HDU 3642 - Get The Treasury - [加强版扫描线+线段树]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3642 Time Limit: 10000/5000 MS (Java/Others) Memory L ...
- hdu3255 线段树扫描线求体积
题意: 给你n个矩形,每个矩形上都有一个权值(该矩形单位面积的价值),矩形之间可能重叠,重叠部分的权值按照最大的算,最后问这n个矩形组成的图形的最大价值. 思路: 线段树扫描线 ...
- 【Codeforces720D】Slalom 线段树 + 扫描线 (优化DP)
D. Slalom time limit per test:2 seconds memory limit per test:256 megabytes input:standard input out ...
随机推荐
- Linux怎么安装vim编译器
我的Linux系统是Ubantu14.04,默认的是vi编译器,现在安装vim编译器 打开终端输入:sudo apt-get install vim-gtk 一般来说就可以了,但是我的提示出现了报错: ...
- filebeat多个key
filebeat.prospectors:- type: log paths: - D:\logs\iis\W3SVC2\*.log exclude_lines: ['^#'] multiline: ...
- 挖洞姿势:特殊的上传技巧,绕过PHP图片转换实现远程代码执行(RCE)
我使用了一个特殊的图片上传技巧,绕过PHP GD库对图片的转换处理,最终成功实现了远程代码执行. 事情是这样的.当时我正在测试该网站上是否存在sql注入漏洞,不经意间我在网站个人页面发现了一个用于上传 ...
- java元注解 @Target注解用法
@Target: @Target说明了Annotation所修饰的对象范围:Annotation可被用于 packages.types(类.接口.枚举.Annotation类型).类型成员(方法.构造 ...
- nginx配置url中带问号的rewrite跳转
今天收到一个需求,要将一个带查询参数的url跳转到另外一个静态url,安装常规的rewrite规则,如: rewrite ^/a.html?id=67$ http://zt.epython.cn/20 ...
- 检验两个随机序列的beta系数
检验两个随机序列的beta系数 代码 def test_beta(loops=10): ''' 检验两个随机序列的beta系数 :loops: int, 循环次数, 每次循环会产生两个随机序列, 然后 ...
- CSS3美化有序列表
如图效果: <ol class="rightList"> <li> <span>周波</span> <span>< ...
- String类型的方法总结
String :字符串对象的包装类型 var stringObject = new String("wanglehui"); 方法总结: 1.返回该对象表示的基本字符串值(也就是返 ...
- Java开发中各种集合框架简介
在大数据MapReduce作业开发中,我们经常会遇到一些大小表的join,这是如果这个小表足够“小”的话,我们可以使用进行“map-join-side”,这要就可以有效的降低reduce端的压力,但是 ...
- 数据库之MySQL存储过程
一.参考文献 https://www.oschina.net/translate/create-and-call-mysql-stored-procedure-database-sql-example ...