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