hdu 3265 Posters
天呐,这算什么啊?
ans+=1ll*len[1]*(ss[i+1].x-ss[i].x);//这里忘了转成long long型了,结果改了一整晚,可是之前没碰过需要转的呀(不解,求解释),orz!!
半信半疑的改完提交了,结果真的过了,再把之前的代码改了一下,还是过了,郁闷!!!
题意:同样是求N个矩形的面积并,只不过,矩形中间存在一个空矩形……
最直观的方法就是将一个带空矩形的矩形分成四个矩形,再按照求面积并的方法求一遍就是了,需要离散化的
#include<iostream>
#include<algorithm>
#define maxn 200100
using namespace std;
struct node
{
int x,y1,y2,s;
node(int a=0,int b=0,int c=0,int d=0):x(a),y1(b),y2(c),s(d){}
friend bool operator<(const node a,const node b)
{
return a.x<b.x;
}
};
bool cmp(node a,node b)
{
return a.x<b.x;
}
node ss[maxn*4];
struct node1
{
int l,r;
}p[maxn<<1];
int len[maxn<<1],cnt[maxn<<1];
int map1[maxn<<1];
void build(int k,int s,int t)
{
p[k].l=s;
p[k].r=t;
if(s==t)
return ;
int kl=k<<1,kr=kl+1,mid=(s+t)>>1;
build(kl,s,mid);
build(kr,mid+1,t);
}
void PushUp(int k)
{
if(cnt[k])
len[k]=map1[p[k].r+1]-map1[p[k].l];
else if(p[k].l==p[k].r)
len[k]=0;
else len[k]=len[k<<1]+len[k<<1|1];
}
void update(int l,int r,int c,int k)
{
if(l<=p[k].l &&p[k].r<=r)
{
cnt[k]+=c;
PushUp(k);
return ;
}
int kl=k<<1,kr=kl+1,mid=(p[k].l+p[k].r)>>1;
if(l<=mid)
update(l,r,c,kl);
if(r>mid)
update(l,r,c,kr);
PushUp(k);
}
int Bin(int key,int n,int map1[]) {
int l = 0 , r = n - 1;
while (l <= r)
{
int mid = (l + r) >> 1;
if (map1[mid] == key) return mid;
if (map1[mid] < key) l = mid + 1;
else r = mid - 1;
}
return -1;
}
int main()
{
int n;
int x1,x2,x3,x4,y1,y2,y3,y4;
while(scanf("%d",&n)==1 &&n)
{
int m=0,cn=0;
while(n--)
{
scanf("%d %d %d %d %d %d %d %d",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4);
ss[m++]=node(x1,y1,y2,1);
ss[m++]=node(x3,y1,y2,-1);
ss[m++]=node(x3,y4,y2,1);
ss[m++]=node(x2,y4,y2,-1);
ss[m++]=node(x4,y3,y4,1);
ss[m++]=node(x2,y3,y4,-1);
ss[m++]=node(x3,y1,y3,1);
ss[m++]=node(x2,y1,y3,-1);
map1[cn++]=y1;map1[cn++]=y2;map1[cn++]=y3;map1[cn++]=y4;
}
sort(ss,ss+m,cmp);
sort(map1,map1+cn);
int k=1;
for (int i = 1 ; i < cn ; i ++)
if (map1[i] != map1[i-1])
map1[k++] =map1[i];
memset(len,0,sizeof(len));
memset(cnt,0,sizeof(cnt));
build(1,0,k-1);
__int64 ans=0;
for(int i=0;i<m-1;i++)
{
int l=Bin(ss[i].y1,k,map1);
int r=Bin(ss[i].y2,k,map1)-1;
if(l<=r)
update(l,r,ss[i].s,1);
ans+=1ll*len[1]*(ss[i+1].x-ss[i].x);
}
printf("%I64d\n",ans);
}
return 0;
}

浙公网安备 33010602011771号