#include<cstdio>
#include<algorithm>
#define LL long long
#define MAXN 150
using namespace std;
//use of main
int n;
struct line
{
LL lx,rx,y;
int flag;
line(){};
line(LL _lx,LL _rx,LL _y,int _flag)
{
lx=_lx,rx=_rx,y=_y,flag=_flag;
}
bool operator < (const line &tmp)const
{
return y<tmp.y;
}
}len[MAXN*2];
//use of LCH
LL X[MAXN*2]={0};
//use of tree
struct tree
{
LL sum;
int flag;
tree(){sum=flag=0;}
}use[MAXN*4];
inline int lc(int x){return x<<1;}
inline int rc(int x){return x<<1|1;}
void up(int x,int l,int r)
{
if(use[x].flag>0)use[x].sum=X[r+1]-X[l];
else if(l==r)use[x].sum=0;
else use[x].sum=use[lc(x)].sum+use[rc(x)].sum;
}
void updata(int x,int l,int r,int op,int ed,int add)
{
if(op<=l&&r<=ed)
{
use[x].flag+=add;
up(x,l,r);
return ;
}
int mid=(l+r)>>1;
if(op<=mid)updata(lc(x),l,mid,op,ed,add);
if(ed>mid)updata(rc(x),mid+1,r,op,ed,add);
up(x,l,r);
}
int find(LL x)
{
int l=1,r=X[0];
int mid=0;
while(l<=r)
{
mid=(l+r)>>1;
if(X[mid]==x)return mid;
if(X[mid]<x)l=mid+1;
else if(X[mid]>x)r=mid-1;
}
}
int main()
{
int N;
n=0;
scanf("%d",&N);
LL x1,x2,y1,y2;
for(int i=1;i<=N;i++)
{
scanf("%I64d%I64d%I64d%I64d",&x1,&y1,&x2,&y2);
if(x1<x2&&y1<y2)
{
len[++n]=line(x1,x2,y1,1);
X[n]=x1;
len[++n]=line(x1,x2,y2,-1);
X[n]=x2;
}
}
sort(X+1,X+n+1);
sort(len+1,len+n+1);
X[0]=1;
for(int i=2;i<=n;i++)
if(X[i]!=X[i-1])
X[++X[0]]=X[i];
LL ans=0;
for(int i=1;i<n;i++)
{
LL l=find(len[i].lx);
LL r=find(len[i].rx)-1;
updata(1,1,X[0],l,r,len[i].flag);
ans+=use[1].sum*(len[i+1].y-len[i].y);
}
printf("%I64d\n",ans);
//while(1);
return 0;
}
【1056】图形面积
最新推荐文章于 2020-07-22 07:30:23 发布