您的位置:首页 > 其它

Rectangles Area Sum

2015-11-22 17:05 323 查看
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define re(i,n) for(int i=0;i<n;i++)
const int maxn=1e4+7;
const int mod=1e9+7;
typedef long long ll;
int x[maxn*2],y[maxn*2],xsz,ysz;
struct Node{
int fy,ty;
int x;
int type;
}a[maxn*2];
bool cmp(const Node&m,const Node&n){
return m.x<n.x;
}
struct Data{
int cnt,len;
}da[maxn*16];
int fy,ty,type;
void insert(int id,int f,int t){
//printf("inserting node %d ,from %d,to %d,fy %d ,ty %d,type %d\n",id,y[f],y[t],fy,ty,type);
if(fy<=y[f]&&ty>=y[t]){
da[id].cnt+=type;
if(da[id].cnt==0){
if(f==t)da[id].len=0;
else da[id].len=da[id<<1].len+da[id<<1|1].len;
}else da[id].len=y[t]-y[f];
return;
}
int mid=(f+t)>>1;
if(ty>y[mid])insert(id<<1|1,mid,t);
if(fy<y[mid])insert(id<<1,f,mid);
if(da[id].cnt==0)da[id].len=da[id<<1].len+da[id<<1|1].len;
else da[id].len=y[t]-y[f];
}
int main(){
int n;
while(cin>>n&&n){
re(i,n){
scanf("%d%d%d%d",&x[i*2],&y[i*2],&x[i*2+1],&y[i*2+1]);
a[i*2].fy=a[i*2+1].fy=min(y[i*2],y[i*2+1]);
a[i*2].ty=a[i*2+1].ty=max(y[i*2],y[i*2+1]);
a[i*2].x=min(x[i*2],x[i*2+1]);
a[i*2+1].x=max(x[i*2],x[i*2+1]);
a[i*2].type=1;
a[i*2+1].type=-1;
}
sort(y,y+n*2),ysz=unique(y,y+n*2)-y;
sort(a,a+n*2,cmp);
ll ans=0;
memset(da,0,sizeof(da));
fy=a[0].fy,ty=a[0].ty,type=a[0].type;
insert(1,0,ysz-1);
//cout<<"The first time "<<da[1].cnt<<endl;
//cout<<"ans is "<<ans<<endl;
for(int i=1;i<n*2;i++){
ans+=(ll)(a[i].x-a[i-1].x)*da[1].len;
ans%=mod;
fy=a[i].fy,ty=a[i].ty,type=a[i].type;
//printf("i=%d\t ans=%lld\t ",i,ans);
insert(1,0,ysz-1);
}
cout<<ans<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: