hdu 3642

题目


求长方体相交3次以上的区域的体积


枚举相邻的两个z,选出z坐标包括枚举范围的长方体的底面,然后求面积覆盖3次以上的,再来乘以枚举的z之差,最后取和。



#include
#include
#include
#include
using namespace std;
typedef long long ll;
mapx;//用来离散x坐标
mapz;//用来离散z坐标,缩小枚举次数
map::iterator it;
int cx[1010*2],cz[1010*2],kx,kz,t,n;
struct spot//长方体
{
    int x1,y1,z1,x2,y2,z2;
}s[1010];

struct line
{
    int s,t,y,cov;
}l[1010*2];
bool cmp(line i,line j)
{
    return i.y>1;
    build(t*2,x,m);
    build(t*2+1,m,y);
}
inline void Push_up(int t)//pushup学得小媛的
{
    if(root[t].cov>=3)
    {
        root[t].len3=cx[root[t].r]-cx[root[t].l];
        root[t].len2=root[t].len1=0;
    }
    else if(root[t].cov==2)
    {
        if(root[t].r-1==root[t].l)
        {
            root[t].len2=cx[root[t].r]-cx[root[t].l];
            root[t].len3=root[t].len1=0;
        }
        else
        {
            root[t].len3=root[t*2].len3+root[t*2+1].len3+root[t*2].len2+root[t*2+1].len2+root[t*2].len1+root[t*2+1].len1;
            root[t].len2=cx[root[t].r]-cx[root[t].l]-root[t].len3;
            root[t].len1=0;
        }
    }
    else if(root[t].cov==1)
    {
         if(root[t].r-1==root[t].l)
        {
            root[t].len1=cx[root[t].r]-cx[root[t].l];
            root[t].len3=root[t].len2=0;
        }
        else
        {
            root[t].len3=root[t*2].len3+root[t*2+1].len3+root[t*2].len2+root[t*2+1].len2;
            root[t].len2=root[t*2].len1+root[t*2+1].len1;
            root[t].len1=cx[root[t].r]-cx[root[t].l]-root[t].len3-root[t].len2;
        }
    }
    else if(root[t].cov==0)
    {
        if(root[t].r-1==root[t].l)
        {
            root[t].len1=root[t].len3=root[t].len2=0;
        }
        else
        {
            root[t].len1=root[t*2].len1+root[t*2+1].len1;
            root[t].len2=root[t*2].len2+root[t*2+1].len2;
            root[t].len3=root[t*2].len3+root[t*2+1].len3;
        }
    }
}
inline void Modefiy(int t,int x,int y,int cov)
{
    int l=root[t].l,r=root[t].r;
    if(ry) return;
    if(l>=x&&r<=y)
    {
        root[t].cov+=cov;
        Push_up(t);
        return;
    }
    if(l+1==r) return;
    Modefiy(t*2,x,y,cov);
    Modefiy(t*2+1,x,y,cov);
    Push_up(t);
}
int main()
{
    scanf("%d",&t);
    for(int Ca=1;Ca<=t;Ca++)
    {
        x.clear(),z.clear();
        kx=1,kz=1;
        scanf("%d",&n);
        for(int i=0;ifirst);
            x[it->first]=kx;
            cx[kx++]=it->first;
        }
        for(it=z.begin();it!=z.end();it++)
        {
            z[it->first]=kz;
            cz[kz++]=it->first;
        }
        ll ans=0;
        if(n>=3)
        {
            for(int i=1;i+1sz)
                    {
                        l[num].s=s[j].x1,l[num].t=s[j].x2,l[num].y=s[j].y1,l[num++].cov=1;
                        l[num].s=s[j].x1,l[num].t=s[j].x2,l[num].y=s[j].y2,l[num++].cov=-1;
                    }
                }
                sort(l,l+num,cmp);
                build(1,1,kx);
                ll temp=0;
                for(int j=0;j+1


你可能感兴趣的:(ACM)