枚举立方体高度 然后对每一层求三次交的面积
#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;
}