题意:求被三个或三个以上立方体重合的体积

分析:就是平面面积的加强,不过归根还是一样的,可以把z轴按照从小向大分区间N个,然后可以得到N个平面,用平面重复三次以上的在和高度计算体积。
************************************************************************
#include<stdio.h>
#include<algorithm>
using namespace std; #define Lson r<<1
#define Rson r<<1|1 const int MAXN = ; struct Edge{int x, y1, y2, dir;}e[MAXN];
struct point{int x1,x2, y1,y2, z1,z2;}p[MAXN];
struct segmentTree
{///cover 表示覆盖的次数
    int L, R, cover;
    long long len1, len2, len3;
    int Mid(){return (L+R)>>;}
}a[MAXN<<];
int Hash_Y[MAXN], ny, Hash_Z[MAXN], nz; bool cmp(Edge n1, Edge n2)
{
    return n1.x < n2.x;
}
int  FindSegLen(int y1, int y2)
{
    return Hash_Y[y2] - Hash_Y[y1];
}
void BuildTree(int r, int L, int R)
{
    a[r].L = L, a[r].R = R;
    a[r].len1 = a[r].len2 = a[r].len3 = a[r].cover = ;     if(L == R-)return ;     BuildTree(Lson, L, a[r].Mid());
    BuildTree(Rson, a[r].Mid(), R);
}
void PushUp(int r)
{///合并,注意要最大区间更新
    if( a[r].cover >  )
        a[r].len1 = a[r].len2 = a[r].len3 = FindSegLen( a[r].L, a[r].R );
    else if( a[r].L == a[r].R- && a[r].cover ==  )
        a[r].len3 = , a[r].len2 = a[r].len1 = FindSegLen( a[r].L, a[r].R );
    else if( a[r].L == a[r].R- && a[r].cover ==  )
        a[r].len3 = a[r].len2 = , a[r].len1 = FindSegLen( a[r].L, a[r].R );
    else if( a[r].L == a[r].R- )
        a[r].len1 = a[r].len2 = a[r].len3 = ;
    else if( a[r].cover ==  )
    {
        a[r].len3 = a[Lson].len1 + a[Rson].len1;
        a[r].len2 = a[r].len1 = FindSegLen( a[r].L, a[r].R );;
    }
    else if( a[r].cover ==  )
    {
        a[r].len3 = a[Lson].len2 + a[Rson].len2;
        a[r].len2 = a[Lson].len1 + a[Rson].len1;
        a[r].len1 = FindSegLen( a[r].L, a[r].R );
    }
    else
    {
        a[r].len3 = a[Lson].len3 + a[Rson].len3;
        a[r].len2 = a[Lson].len2 + a[Rson].len2;
        a[r].len1 = a[Lson].len1 + a[Rson].len1;
    }
}
void UpData(int r, int L, int R, int dir)
{
    if( a[r].L == L && a[r].R == R )
    {
        a[r].cover += dir;
        PushUp(r);         return ;
    }     if(R <= a[r].Mid())
        UpData(Lson, L, R, dir);
    else if(L >= a[r].Mid())
        UpData(Rson, L, R, dir);
    else
    {
        UpData(Lson, L, a[r].Mid(), dir);
        UpData(Rson, a[r].Mid(), R, dir);
    }     PushUp(r);
} int main()
{
    int T, t=;     scanf("%d", &T);     while(T--)
    {
        int i, j, k, N;
        long long V=;         scanf("%d", &N);         for(nz=i=; i<N; i++)
        {
            scanf("%d%d%d%d%d%d", &p[i].x1,&p[i].y1,&p[i].z1,&p[i].x2,&p[i].y2,&p[i].z2);
            Hash_Z[nz++] = p[i].z1, Hash_Z[nz++] = p[i].z2;
        }         sort(Hash_Z, Hash_Z+nz);
        nz = unique(Hash_Z, Hash_Z+nz) - Hash_Z;         for(i=; i<nz-; i++)
        {///以z轴底部开始,判断每层是否有三个区间重合的
            for(ny=k=j=; j<N; j++)
            {
                if( Hash_Z[i] >= p[j].z1 && Hash_Z[i] < p[j].z2 )
                {
                    e[k].x=p[j].x1, e[k].y1=p[j].y1, e[k].y2=p[j].y2, e[k++].dir=;
                    e[k].x=p[j].x2, e[k].y1=p[j].y1, e[k].y2=p[j].y2, e[k++].dir=-;
                    Hash_Y[ny++] = p[j].y1, Hash_Y[ny++] = p[j].y2;
                }
            }             sort(Hash_Y, Hash_Y+ny);
            ny = unique(Hash_Y, Hash_Y+ny)-Hash_Y;
            BuildTree(, , ny-);             sort(e, e+k, cmp);             long long S = ;             for(j=; j<k-; j++)
            {
                int L = lower_bound(Hash_Y, Hash_Y+ny, e[j].y1) - Hash_Y;
                int R = lower_bound(Hash_Y, Hash_Y+ny, e[j].y2) - Hash_Y;                 UpData(, L, R, e[j].dir);                 S += (long long)a[].len3 * ( e[j+].x - e[j].x );
            }             V += S * (Hash_Z[i+] - Hash_Z[i]);
        }         printf("Case %d: %lld\n", t++, V);
    }     return ;
}

Q - Get The Treasury - HDU 3642 (扫面线求体积)的更多相关文章

  1. Get The Treasury HDU - 3642(体积扫描线)

    给出n个立方体,要你求这些立方体至少被覆盖三次的部分. 先把这个立方体的信息存在来,发现Z的范围不大,z范围是是[-500,500],所以我们可以先离散化,然后枚举Z, 然后对于每一段Z的区域内,在当 ...

  2. Get The Treasury HDU - 3642(扫描线求三维面积交。。体积交)

    题意: ...就是求体积交... 解析: 把每一层z抽出来,计算面积交, 然后加起来即可..! 去看一下 二维面积交的代码 再看看这个三维面积交的代码.. down函数里 你发现了什么规律!!! 参考 ...

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

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

  4. HDU 3255 Farming (线段树+扫面线,求体积并)

    题意:在一块地上种蔬菜,每种蔬菜有个价值.对于同一块地蔬菜价值高的一定是最后存活,求最后的蔬菜总值. 思路:将蔬菜的价值看做高度的话,题目就转化成求体积并,这样就容易了. 与HDU 3642 Get ...

  5. Q - Play With Sequence HDU - 3971 线段树 重新排序建树

    Q - Play With Sequence HDU - 3971 这个题目是一个线段树,比较特别的线段树,就是c询问一定次数之后重新排序建树来优化减低复杂度. 第一次碰到这种题目有点迷. 这个题目写 ...

  6. hdu 3642 Get The Treasury

    Get The Treasury http://acm.hdu.edu.cn/showproblem.php?pid=3642 Time Limit: 10000/5000 MS (Java/Othe ...

  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. HDU 3642 Get The Treasury (线段树扫描线,求体积并)

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

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

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

随机推荐

  1. OpenStack Neutron DVR L2 Agent的初步解析 (一)

    声明: 本博客欢迎转载,但请保留原作者信息! 作者:林凯 团队:华为杭州OpenStack团队 OpenStack Juno版本号已正式公布,这是这个开源云平台的10个版本号,在Juno版的Neutr ...

  2. PHP5.4的变化关注---What has changed in PHP 5.4.x(转)

    What has changed in PHP 5.4.x Most improvements in PHP 5.4.x have no impact on existing code. There ...

  3. Drawable 着色的后向兼容方案

    看到 Android Weekly 最新一期有一篇文章:Tinting drawables,使用 ColorFilter 手动打造了一个TintBitmapDrawable,之前也看到有些文章使用这种 ...

  4. 解压版mysql安装--windows系统

    1 解压到某个目录 2 配置配置文件 3 执行命令:安装目录/bin/mysqld --install mysql5.6 --defaults-file=指定配置文件位置 "安装目录/bin ...

  5. Swift中出现“no such module cocoa”的错误

    在Swift开发中,新建了一个UIViewController的子类出现“No such module 'Cocoa' 的错误, 头部是import cocoa.. 原因很简单:在建立新的File文件 ...

  6. 使用WebFrom来模拟一些MVC的MODEL与View的数据交互功能

    MVC中有一点非常闪瞎人眼的功能就是,可以根据Model与View视图来直接将页面也数据模型进行绑定,那么我们在想客户端发送页面时不需要进行各种控件赋值,不需要操心怎么渲染,当客户提交表单给服务器时也 ...

  7. Qt5如何设置静态编译,解决生成的可执行文件打开出错问题

    将https://yunpan.cn/cqGGURjmG2fEY  访问密码 8de5  中的压缩包Qt5-MSVC-Static-master.zip 解压到你的qt安装目录,一般就是C:\Qt下, ...

  8. IE10的bug?disabled button如何触发事件

    最近碰到一个问题,IE10下的,貌似是个bug,求助! 问题表现为:在内部有dom元素的情况下,disabled状态的button会因为子元素的mouseover产生事件冒泡而触发,也就是说,disa ...

  9. 将日志写入Debug窗口

    定义在NuGet包“Microsoft.Extensions.Logging.Debug”中的DebugLogger会直接调用Debug的WriteLine方法来写入分发给它的日志消息.如果需要使用D ...

  10. MSP430单片机的中断

    这篇文章是从网上转载过来的,原文章地址:http://www.21ic.com/jichuzhishi/mcu/questions/2012-12-21/154794.html 中断是MSP430微处 ...