立方体交,自己写的莫名其妙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扫描线 长方体的更多相关文章

  1. HDU3642 Get The Treasury —— 求矩形交体积 线段树 + 扫描线 + 离散化

    题目链接:https://vjudge.net/problem/HDU-3642 Jack knows that there is a great underground treasury in a ...

  2. hdu3642 Get The Treasury 线段树--扫描线

    Jack knows that there is a great underground treasury in a secret region. And he has a special devic ...

  3. Get The Treasury【HDU-3642】【扫描线】

    题目链接 题目给出的是N个体积块,问的是有多少体积重叠了3次及以上? 那么就是怎么处理体积这样子的问题了,看到Z的种类不多的时候,就想着从Z离散化的角度去考虑这个问题了,然后就是怎样子去处理面积了,这 ...

  4. 线段树总结 (转载 里面有扫描线类 还有NotOnlySuccess线段树大神的地址)

    转载自:http://blog.csdn.net/shiqi_614/article/details/8228102 之前做了些线段树相关的题目,开学一段时间后,想着把它整理下,完成了大牛NotOnl ...

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

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

  6. hdu3255扫描线:带权面积交转体积交

    手贱把i打成j,调了半天 /* 面积并转体积并,长方体高度为作物价格 算体积并:在笛卡尔坐标系的y轴上建立线段树cnt记录区间被完全覆盖的次数,sum记录区间被覆盖的总长度 以平行于xoy的平面从下往 ...

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

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

  8. hdu3255 线段树扫描线求体积

    题意:       给你n个矩形,每个矩形上都有一个权值(该矩形单位面积的价值),矩形之间可能重叠,重叠部分的权值按照最大的算,最后问这n个矩形组成的图形的最大价值. 思路:       线段树扫描线 ...

  9. 【Codeforces720D】Slalom 线段树 + 扫描线 (优化DP)

    D. Slalom time limit per test:2 seconds memory limit per test:256 megabytes input:standard input out ...

随机推荐

  1. python爬虫 前程无忧网页抓取

    Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门 https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6E ...

  2. Hadoop集群-HDFS集群中大数据运维常用的命令总结

    Hadoop集群-HDFS集群中大数据运维常用的命令总结 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客会简单涉及到滚动编辑,融合镜像文件,目录的空间配额等运维操作简介.话 ...

  3. JVM总结(二):JVM的内存分配策略

    这节我们总结一下JVM中的内存分配策略.目录如下: 内存分配策略 对象优先在新生代Eden分配 大对象直接进入老年代 长期存活的对象将进入老年代 动态对象年龄判定 空间分配担保 内存分配策略 Java ...

  4. CM记录-JVM调优

    1.堆栈大小 2.JVM重用 3.GC

  5. .NET MVC中的数据验证

    一  概述 关于数据验证和数据注解,是任何软件系统不可小觑的必要模块,主要作用是为了保证数据安全性.防止漏洞注入和网络攻击.从数据验证的验证方式来说,我们一般分为客户端验证和服务端验证(或者两种方式相 ...

  6. Hibernate_day01

    一.今天内容介绍 1 web内容回顾 (1)javaee三层结构 (2)mvc思想 2 hibernate概述 3 hibernate入门案例 4 hibernate配置文件 5 hibernate的 ...

  7. JMS学习(七)-ActiveMQ消息的持久存储方式之KahaDB存储

    一,介绍 自ActiveMQ5.4以来,KahaDB成为了ActiveMQ默认的持久化存储方式.相比于原来的AMQ存储方式,官方宣称KahaDB使用了更少的文件描述符,并且提供了更快的存储恢复机制. ...

  8. 一个简单的"RPC框架"代码分析

    0,服务接口定义---Echo.java /* * 定义了服务器提供的服务类型 */ public interface Echo { public String echo(String string) ...

  9. Java内存泄露处理

    https://www.cnblogs.com/likeli/p/9413830.html

  10. GBK-----UTF-8编码格式问题浅析

    首先,想必大家在不同环境下切换写代码的时候,都会遇见乱码的时候(读取二进制的时候采用的编码和最初将字符转换成二进制时的编码不一致.),大多数人都知道,只需要把项目工程的编码格式调整一下为最初的编码就可 ...