#include<iostream>
#include<fstream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<vector>
#include<queue>
#include<deque>
#include<utility>
#include<map>
#include<set>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<functional>
#include<sstream>
#include<cstring>
#include<bitset>
#include<stack>
using namespace std;
int n,x1,y1x,x2,y2,ans,cnt;
struct sdt
{
int l,r,y,flag;
}line[500005];
int old[500005],lef[500005],rig[500005],sum[500005],cntx[500005],ll[500005],rr[500005];
bool cmp(sdt x,sdt y)
{
return x.y<y.y;
}
int read()
{
int x=0;char c=getchar();
while(c<48||c>57)c=getchar();
while(c>47&&c<58)x*=10,x+=c-48,c=getchar();
return x;
}
void check(int x)
{
if(cntx[x])sum[x]=rr[x]-ll[x];
else if(rig[x]-lef[x]==1)sum[x]=0;
else sum[x]=sum[x*2]+sum[x*2+1];
}
void build(int root,int l,int r)
{
lef[root]=l;
rig[root]=r;
ll[root]=old[l];
rr[root]=old[r];
sum[root]=0;
cntx[root]=0;
if(l+1==r)return ;
int mid=(l+r)/2;
build(root*2,l,mid);
build(root*2+1,mid,r);
}
void update(int root,sdt x)
{
if(x.l==ll[root] && x.r==rr[root])
{
cntx[root]+=x.flag;
check(root);
return ;
}
if(x.l>=ll[root*2+1])update(root*2+1,x);
else if(x.r<=rr[root*2])update(root*2,x);
else
{
sdt xx;
xx=x;
xx.r=rr[root*2];
update(root*2,xx);
xx=x;
xx.l=ll[root*2+1];
update(root*2+1,xx);
}
check(root);
}
int main()
{
n=read();
for(int i=1;i<=n;i++)
{
x1=read();
y1x=read();
x2=read();
y2=read();
line[++cnt].y=y1x;
line[cnt].l=x1;
line[cnt].r=x2;
line[cnt].flag=1;
old[cnt]=x1;
line[++cnt].y=y2;
line[cnt].l=x1;
line[cnt].r=x2;
line[cnt].flag=-1;
old[cnt]=x2;
}
sort(line+1,line+cnt+1,cmp);
sort(old+1,old+cnt+1);
build(1,1,cnt);
update(1,line[1]);
for(int i=2;i<=cnt;i++)
{
ans+=sum[1]*(line[i].y-line[i-1].y);
update(1,line[i]);
}
printf("%d\n",ans);
return 0;
}
【BZOJ】1382: [Baltic2001]Mars Maps (线段树+扫描线)
原文:http://www.cnblogs.com/winmt/p/6657888.html