标签:des style blog http color java os io
解题报告
题意:
矩形面积并。
思路:
扫描线+线段树
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
struct Seg
{
int lx,rx,h,v;
friend bool operator < (Seg a,Seg b)
{
return a.h<b.h;
}
} seg[500000];
int lz[201000],sum[201000];
void push_up(int rt,int l,int r)
{
if(lz[rt])
sum[rt]=r+1-l;
else if(l==r)sum[rt]=0;
else sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void update(int rt,int l,int r,int ql,int qr,int v)
{
if(ql>r||qr<l)return ;
if(ql<=l&&r<=qr)
{
lz[rt]+=v;
push_up(rt,l,r);
return ;
}
int mid=(l+r)>>1;
update(rt<<1,l,mid,ql,qr,v);
update(rt<<1|1,mid+1,r,ql,qr,v);
push_up(rt,l,r);
}
int main()
{
int n,i,j,x1,y1,x2,y2,x3,y3,x4,y4;
while(~scanf("%d%d%d%d",&x1,&y1,&x2,&y2))
{
int m=0;
if(x1==y1&&x2==y2&&x1==x2&&x1==-2)break;
memset(lz,0,sizeof(lz));
memset(sum,0,sizeof(sum));
seg[m].lx=min(x1,x2);seg[m].rx=max(x1,x2);seg[m].v=1;seg[m++].h=min(y1,y2);
seg[m].lx=min(x1,x2);seg[m].rx=max(x1,x2);seg[m].v=-1;seg[m++].h=max(y1,y2);
while(~scanf("%d%d%d%d",&x1,&y1,&x2,&y2))
{
if(x1==y1&&x2==y2&&x1==x2&&x1==-2)break;
if(x1==y1&&x2==y2&&x1==x2&&x1==-1)break;
seg[m].lx=min(x1,x2);seg[m].rx=max(x1,x2);seg[m].v=1;seg[m++].h=min(y1,y2);
seg[m].lx=min(x1,x2);seg[m].rx=max(x1,x2);seg[m].v=-1;seg[m++].h=max(y1,y2);
}
sort(seg,seg+m);
int ans=0;
for(i=0; i<m-1; i++)
{
update(1,0,100-1,seg[i].lx,seg[i].rx-1,seg[i].v);
ans+=sum[1]*(seg[i+1].h-seg[i].h);
}
printf("%d\n",ans);
}
return 0;
}
5 8 7 10 6 9 7 8 6 8 8 11 -1 -1 -1 -1 0 0 100 100 50 75 12 90 39 42 57 73 -2 -2 -2 -2
8 10000
HDU1377_Counting Squares(扫描线/线段树),布布扣,bubuko.com
HDU1377_Counting Squares(扫描线/线段树)
标签:des style blog http color java os io
原文地址:http://blog.csdn.net/juncoder/article/details/38616219