求覆盖大于一次的总面积
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#define lson i<<1
#define rson (i<<1)+1
using namespace std;
double a[5000];
int va[50000],n,pre;
double ha[50000],len[50000][2];
struct node{
double x1,x2,y;
int sym;
}no[5000];
bool cmp(node no1,node no2)
{
return no1.y < no2.y;
}
void pushUp(int rt,int l,int r)
{
if(va[rt])len[rt][0] = ha[r+1]-ha[l];
else if(l==r)len[rt][0] = 0.0;
else len[rt][0] = len[rt<<1][0] + len[rt<<1|1][0];
if(va[rt]>=2)len[rt][1] = len[rt][0];
else if(va[rt]==1)len[rt][1] = len[rt<<1][0] + len[rt<<1|1][0];
else if(l==r)len[rt][1] = 0.0;
else len[rt][1] = len[rt<<1][1] + len[rt<<1|1][1];
}
void update(int i,int l,int r,int L,int R,int sym)
{
if(l==L&&r==R)
{
va[i]+=sym;
pushUp(i,l,r);
return ;
}
if(R<=(l+r)/2)update(lson,l,(l+r)/2,L,R,sym);
else if(L>=(r+l)/2+1)update(rson,(l+r)/2+1,r,L,R,sym);
else
{
update(lson,l,(l+r)/2,L,(l+r)/2,sym);
update(rson,(l+r)/2+1,r,(l+r)/2+1,R,sym);
}
pushUp(i,l,r);
}
int main()
{
int i1 = 1;
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
map<double,int>mp;
double x1,y1,x2,y2,ans = 0.0;
pre = 0;
for(int i=0;i<n;i++)
{
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
a[i*2] = x1,
a[i*2+1] = x2;
no[i*2].x1 = x1;
no[i*2].x2 = x2;
no[i*2].y = y1;
no[i*2].sym = 1;
no[i*2+1].x1 = x1;
no[i*2+1].x2 = x2;
no[i*2+1].y = y2;
no[i*2+1].sym = -1;
}
sort(a,a+2*n);
sort(no,no+2*n,cmp);
mp[a[0]] = pre;
ha[pre] = a[0];
pre++;
for(int i=1;i<2*n;i++)
if(a[i]>a[i-1])
{
mp[a[i]] = pre;
ha[pre] = a[i];
pre++;
}
memset(va,0,sizeof(va));
memset(len,0,sizeof(len));
for(int i=0;i<2*n-1;i++)
{
update(1,0,pre,mp[no[i].x1],mp[no[i].x2]-1,no[i].sym);
ans+=len[1][1]*(no[i+1].y-no[i].y);
}
printf("%.2f\n",ans);
}
return 0;
}