Get The Treasury HDU - 3642

点击打开链接

枚举立方体高度 然后对每一层求三次交的面积

#include <bits/stdc++.h>
using namespace std;
#define ll long long

struct node1
{
    int x1;
    int y1;
    int z1;
    int x2;
    int y2;
    int z2;
};

struct node2
{
    int l;
    int r;
    int h;
    int f;
};

struct node3
{
    ll l;
    ll r;
    int f;
    int leaf;
    ll val1;
    ll val2;
    ll val3;
};

node1 cube[1010];
node2 seg[2010];
node3 tree[8010];
ll prex[2010],prez[2010];
int n,m;

bool cmp(node2 n1,node2 n2)
{
    return n1.h<n2.h;
}

void pushup(int cur)
{
    if(tree[cur].f>2)
    {
        tree[cur].val1=tree[cur].r-tree[cur].l;
        tree[cur].val2=tree[cur].r-tree[cur].l;
        tree[cur].val3=tree[cur].r-tree[cur].l;
    }
    else if(tree[cur].f==2)
    {
        tree[cur].val1=tree[cur].r-tree[cur].l;
        tree[cur].val2=tree[cur].r-tree[cur].l;
        if(tree[cur].leaf) tree[cur].val3=0;
        else tree[cur].val3=tree[2*cur].val1+tree[2*cur+1].val1;
    }
    else if(tree[cur].f==1)
    {
        tree[cur].val1=tree[cur].r-tree[cur].l;
        if(tree[cur].leaf) tree[cur].val2=0;
        else tree[cur].val2=tree[2*cur].val1+tree[2*cur+1].val1;
        if(tree[cur].leaf) tree[cur].val3=0;
        else tree[cur].val3=tree[2*cur].val2+tree[2*cur+1].val2;
    }
    else
    {
        if(tree[cur].leaf) tree[cur].val1=0;
        else tree[cur].val1=tree[2*cur].val1+tree[2*cur+1].val1;
        if(tree[cur].leaf) tree[cur].val2=0;
        else tree[cur].val2=tree[2*cur].val2+tree[2*cur+1].val2;
        if(tree[cur].leaf) tree[cur].val3=0;
        else tree[cur].val3=tree[2*cur].val3+tree[2*cur+1].val3;
    }
    return;
}

void build(int l,int r,int cur)
{
    int m;
    tree[cur].l=prex[l];
    tree[cur].r=prex[r];
    tree[cur].val1=0;
    tree[cur].val2=0;
    tree[cur].val3=0;
    tree[cur].f=0;
    tree[cur].leaf=0;
    if(l+1==r)
    {
        tree[cur].leaf=1;
        return;
    }
    m=(l+r)/2;
    build(l,m,2*cur);
    build(m,r,2*cur+1);
    return;
}

void scan(int pl,int pr,int f,int cur)
{
    if(pl<=tree[cur].l&&tree[cur].r<=pr)
    {
        tree[cur].f+=f;
        pushup(cur);
        return;
    }
    if(pl<tree[2*cur].r) scan(pl,pr,f,2*cur);
    if(pr>tree[2*cur+1].l) scan(pl,pr,f,2*cur+1);
    pushup(cur);
    return;
}

int main()
{
    ll ans,area;
    int t,cas,i,j,k,l;
    scanf("%d",&t);
    for(cas=1;cas<=t;cas++)
    {
        scanf("%d",&n);
        for(i=1;i<=n;i++)
        {
            scanf("%d%d%d%d%d%d",&cube[i].x1,&cube[i].y1,&cube[i].z1,&cube[i].x2,&cube[i].y2,&cube[i].z2);
            prez[2*i-1]=cube[i].z1,prez[2*i]=cube[i].z2;
        }
        sort(prez+1,prez+2*n+1);
        for(i=1,m=0;i<=2*n;i++)
        {
            if(m==0||prez[m]!=prez[i])
            {
                prez[++m]=prez[i];
            }
        }
        ans=0;
        for(i=1;i<=m-1;i++)
        {
            for(j=1,k=0;j<=n;j++)
            {
                if(cube[j].z1<=prez[i]&&prez[i]<cube[j].z2)
                {
                    k++;
                    seg[2*k-1].l=cube[j].x1,seg[2*k-1].r=cube[j].x2,seg[2*k-1].h=cube[j].y1,seg[2*k-1].f=1;
                    seg[2*k].l=cube[j].x1,seg[2*k].r=cube[j].x2,seg[2*k].h=cube[j].y2,seg[2*k].f=-1;
                    prex[2*k-1]=cube[j].x1,prex[2*k]=cube[j].x2;
                }
            }
            sort(seg+1,seg+2*k+1,cmp);
            sort(prex+1,prex+2*k+1);
            for(j=1,l=0;j<=2*k;j++)
            {
                if(l==0||prex[l]!=prex[j])
                {
                    prex[++l]=prex[j];
                }
            }
            build(1,l,1);
            area=0;
            for(j=1;j<=2*k;j++)
            {
                area+=(seg[j].h-seg[j-1].h)*tree[1].val3;
                scan(seg[j].l,seg[j].r,seg[j].f,1);
            }
            ans+=(prez[i+1]-prez[i])*area;
        }
        printf("Case %d: %lld\n",cas,ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sunyutian1998/article/details/80415955
get