poj 1177
线段树,详见陈宏的论文。简单讲就是每两次覆盖之间的差值的总和。
代码:
#include<iostream>
#include<fstream>
#include<cmath>
using namespace std;
struct e{
int l,r,conut,size;
}tree[5000*8];
int a[20001];
int b[20001];
int a1[10001];
int b1[10001];
int n;
struct xxx{
int s,t,f,x;
}xx[10001];
struct yyy{
int s,t,f,y;
}yy[10001];
void build(int l,int r,int p){
tree[p].l=l;
tree[p].r=r;
tree[p].size=0;
tree[p].conut=0;
if(l<r-1)
{
int mid=(l+r)>>1;
build(l,mid,2*p);
build(mid,r,2*p+1);
}
}
int cmp(const void *a,const void *b){
return ((xxx *)a)->x-((xxx *)b)->x;
}
int cmp1(const void *a,const void *b){
return ((yyy *)a)->y-((yyy *)b)->y;
}
void insert(int l,int r,int p,int f){
if(tree[p].l==l&&tree[p].r==r)
{
tree[p].conut++;
if(tree[p].conut==1)
{
if(f==0)
tree[p].size=a1[r]-a1[l];
else
tree[p].size=b1[r]-b1[l];
}
}
else
{
int mid=(tree[p].l+tree[p].r)>>1;
if(r<=mid)
insert(l,r,2*p,f);
else
if(l>=mid)
insert(l,r,2*p+1,f);
else
{
insert(l,mid,2*p,f);
insert(mid,r,2*p+1,f);
}
if(tree[p].conut==0)
{
tree[p].size=tree[2*p].size+tree[2*p+1].size;
}
}
}
void delet(int l,int r,int p){
if(tree[p].l==l&&tree[p].r==r)
{
tree[p].conut--;
if(tree[p].conut==0)
tree[p].size=tree[2*p].size+tree[2*p+1].size;
}
else
{
int mid=(tree[p].l+tree[p].r)>>1;
if(r<=mid)
delet(l,r,2*p);
else
if(l>=mid)
delet(l,r,2*p+1);
else
{
delet(l,mid,2*p);
delet(mid,r,2*p+1);
}
if(tree[p].conut==0)
{
tree[p].size=tree[2*p].size+tree[2*p+1].size;
}
}
}
int cmp2(const void *a,const void *b){
return *((int *)a)-*((int*)b);
}
void read(){
// ifstream cin("in.txt");
int i,j,k,k1;
int m1,m2,m3,m4;
// cin>>n;
scanf("%d",&n);
k=0;k1=0;
for(i=1;i<=n;i++)
{
// cin>>m1>>m2>>m3>>m4;
scanf("%d%d%d%d",&m1,&m2,&m3,&m4);
if(!b[m1+10000])
{
b[m1+10000]=1;
b1[++k1]=m1;
}
if(!a[m2+10000])
{
a[m2+10000]=1;
a1[++k]=m2;
}
if(!b[m3+10000])
{
b[m3+10000]=1;
b1[++k1]=m3;
}
if(!a[m4+10000])
{
a[m4+10000]=1;
a1[++k]=m4;
}
xx[2*i-1].s=m2;
xx[2*i-1].t=m4;
xx[2*i-1].f=0;
xx[2*i-1].x=m1;
xx[2*i].s=m2;
xx[2*i].t=m4;
xx[2*i].f=1;
xx[2*i].x=m3;
yy[2*i-1].s=m1;
yy[2*i-1].t=m3;
yy[2*i-1].f=0;
yy[2*i-1].y=m2;
yy[2*i].s=m1;
yy[2*i].t=m3;
yy[2*i].f=1;
yy[2*i].y=m4;
}
qsort(a1+1,k,sizeof(int),cmp2);
qsort(b1+1,k1,sizeof(int),cmp2);
for(i=1;i<=k;i++)
a[a1[i]+10000]=i;
for(i=1;i<=k1;i++)
b[b1[i]+10000]=i;
build(1,k,1);
qsort(xx+1,2*n,sizeof(xxx),cmp);
qsort(yy+1,2*n,sizeof(yyy),cmp1);
j=0;
int ans=0;
for(i=1;i<=2*n;i++)
{
if(xx[i].f==0)
insert(a[xx[i].s+10000],a[xx[i].t+10000],1,0);
else
delet(a[xx[i].s+10000],a[xx[i].t+10000],1);
ans+=abs(tree[1].size-j);
j=tree[1].size;
}
build(1,k1,1);
j=0;
for(i=1;i<=2*n;i++)
{
if(yy[i].f==0)
insert(b[yy[i].s+10000],b[yy[i].t+10000],1,1);
else
delet(b[yy[i].s+10000],b[yy[i].t+10000],1);
ans+=abs(tree[1].size-j);
j=tree[1].size;
}
cout<<ans<<endl;
}
int main(){
read();
return 0;
}
浙公网安备 33010602011771号