标签:des style http color java os io strong
解题报告
题意:
给定的矩形里面有镂空的矩阵,求矩阵面积并。
思路:
直接把一个图形拆成4个矩形,进行面积并。
扫描线+线段树
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#define LL __int64
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",&n))
{
if(!n)break;
int m=0;
memset(lz,0,sizeof(lz));
memset(sum,0,sizeof(sum));
for(i=0; i<n; i++)
{
scanf("%d%d%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4);
seg[m].lx=x1;
seg[m].rx=x3;
seg[m].v=1;
seg[m++].h=y1;
seg[m].lx=x1;
seg[m].rx=x3;
seg[m].v=-1;
seg[m++].h=y2;
seg[m].lx=x3;
seg[m].rx=x4;
seg[m].v=1;
seg[m++].h=y1;
seg[m].lx=x3;
seg[m].rx=x4;
seg[m].v=-1;
seg[m++].h=y3;
seg[m].lx=x3;
seg[m].rx=x4;
seg[m].v=1;
seg[m++].h=y4;
seg[m].lx=x3;
seg[m].rx=x4;
seg[m].v=-1;
seg[m++].h=y2;
seg[m].lx=x4;
seg[m].rx=x2;
seg[m].v=1;
seg[m++].h=y1;
seg[m].lx=x4;
seg[m].rx=x2;
seg[m].v=-1;
seg[m++].h=y2;
}
sort(seg,seg+m);
LL ans=0;
for(i=0; i<m-1; i++)
{
update(1,0,50000-1,seg[i].lx,seg[i].rx-1,seg[i].v);
ans+=(LL)sum[1]*(seg[i+1].h-seg[i].h);
}
printf("%I64d\n",ans);
}
return 0;
}
2 0 0 10 10 1 1 9 9 2 2 8 8 3 3 7 7 0
56
HDU3265_Posters(扫描线/线段树),布布扣,bubuko.com
标签:des style http color java os io strong
原文地址:http://blog.csdn.net/juncoder/article/details/38616097