zoukankan      html  css  js  c++  java
  • Get The Treasury HDU

    题意:

    。。。就是求体积交。。。

    解析:

      把每一层z抽出来,计算面积交, 然后加起来即可。。!

    去看一下 二维面积交的代码 再看看这个三维面积交的代码。。 down函数里 你发现了什么规律!!!

    参考二维面积交:https://www.cnblogs.com/WTSRUVF/p/9274318.html

    代码如下  

    #include <cstdio>
    #include <iostream>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <queue>
    #define mem(a, b) memset(a, b, sizeof(a))
    using namespace std;
    const int maxn = 8010, INF = 0x7fffffff;
    typedef long long LL;
    int X[maxn];
    
    struct node{
        int l, r, w;
        int lx, rx, sum, lsum, llsum;
    }Node[maxn];
    
    struct edge{
        int lxx, rxx, y, z1, z2;
        int f;
    }Edge[maxn*2];
    
    int cmp(edge a, edge b)
    {
        return a.y < b.y;
    }
    
    void build(int k, int ll, int rr)
    {
        Node[k].l = ll, Node[k].r = rr;
        Node[k].w = Node[k].sum = Node[k].lsum = Node[k].llsum = 0;
        Node[k].lx = X[ll];
        Node[k].rx = X[rr];
        if(ll + 1 == rr) return;
        int m = (ll + rr) / 2;
        build(k*2, ll, m);
        build(k*2+1, m, rr);
    }
    
    void down(int k)
    {
        int len = Node[k].rx - Node[k].lx;
        if(Node[k].w >= 3)
        {
            Node[k].sum = Node[k].lsum = Node[k].llsum = len;
        }
        else if(Node[k].w == 2)
        {
            Node[k].lsum = Node[k].llsum = len;
            if(Node[k].l + 1 == Node[k].r)
                Node[k].sum = 0;
            else
                Node[k].sum = Node[k*2].lsum + Node[k*2+1].lsum;
        }
        else if(Node[k].w == 1)
        {
            Node[k].lsum = len;
            if(Node[k].l + 1 == Node[k].r)
                Node[k].llsum = Node[k].sum = 0;
            else
            {
                Node[k].llsum = Node[k*2].lsum + Node[k*2+1].lsum;
                Node[k].sum = Node[k*2].llsum + Node[k*2+1].llsum;
            }
        }
        else
        {
            if(Node[k].l + 1 == Node[k].r)
                Node[k].sum = Node[k].lsum = Node[k].llsum = 0;
            else
            {
                Node[k].lsum = Node[k*2].lsum + Node[k*2+1].lsum;
                Node[k].llsum = Node[k*2].llsum + Node[k*2+1].llsum;
                Node[k].sum = Node[k*2].sum + Node[k*2+1].sum;
            }
        }
    
    }
    
    void update(int k, edge e)
    {
        if(Node[k].lx == e.lxx && Node[k].rx == e.rxx)
        {
            Node[k].w += e.f;
            down(k);
            return;
        }
        if(e.rxx <= Node[k*2].rx) update(k*2, e);
        else if(e.lxx >= Node[k*2+1].lx) update(k*2+1, e);
        else
        {
            edge temp = e;
            temp.rxx = Node[k*2].rx;
            update(k*2, temp);
            temp = e;
            temp.lxx = Node[k*2+1].lx;
            update(k*2+1, temp);
        }
        down(k);
    }
    
    int main()
    {
        int T, kase = 0;
        scanf("%d",&T);
        while(T--)
        {
            int n, cnt = 0;
            scanf("%d",&n);
            for(int i=0; i<n; i++)
            {
                int x1, y1, z1, x2, y2, z2;
                scanf("%d%d%d%d%d%d", &x1, &y1, &z1, &x2, &y2, &z2);
                Edge[++cnt].lxx = x1, Edge[cnt].rxx = x2, Edge[cnt].y = y1, Edge[cnt].f = 1, Edge[cnt].z1= z1, Edge[cnt].z2 = z2;
                X[cnt] = x1;
                Edge[++cnt].lxx = x1, Edge[cnt].rxx = x2, Edge[cnt].y = y2, Edge[cnt].f = -1, Edge[cnt].z1= z1, Edge[cnt].z2 = z2;
                X[cnt] = x2;
            }
            sort(Edge+1, Edge+cnt+1, cmp);
            sort(X+1, X+cnt+1);
            int m = unique(X+1, X+cnt+1) - (X+1);
            LL ret = 0;
            for(int i=-500; i<=500; i++)
            {
                build(1, 1, m);
                int ans = 0;
                edge line[maxn];
                for(int j=1; j<=cnt; j++)
                {
                    if(Edge[j].z1 <= i && Edge[j].z2 > i)
                        line[++ans] = Edge[j];
                }
                for(int j=1; j<ans; j++)
                {
                    update(1, line[j]);
                    ret += (LL)Node[1].sum * (line[j+1].y - line[j].y);
                }
            }
            printf("Case %d: %lld
    ",++kase,ret);
    
        }
    
        return 0;
    }
    自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。
  • 相关阅读:
    (Step by Step)How to setup IP Phone Server(VoIP Server) for free.
    感冒流鼻涕怎么办?
    Robocopy是微软Windows Server 2003资源工具包中众多多用途的实用程序之一(它是基于强大的拷贝程序
    jsp页面:js方法里嵌套java代码(是操作数据库的),如果这个js 方法没被调用,当jsp页面被解析的时候,不管这个js方法有没有被调用这段java代码都会被执行?
    如何在 js 代码中使用 jsp 标签或 Java 代码
    第三范式
    Cannot forward after response has been committed 错误
    安装visio 2010:您的计算机上的Office 2003安装已损坏,安装程序无法继续。请删除或修复office 2003产品并重新运行安装程序
    自己WIN7旗舰版安装 SQLServer2005/2008的一些总结
    建筑基坑工程设计计算与施工(一)
  • 原文地址:https://www.cnblogs.com/WTSRUVF/p/9275331.html
Copyright © 2011-2022 走看看