首页 > 代码库 > 离散化的应用:矩形覆盖问题
离散化的应用:矩形覆盖问题
给出一列矩形,求被矩形覆盖的面积总共有多少?
显然,最简单的办法就是模拟.设置一个布尔型二维数组,将有矩形覆盖的方格填上1,最后统计一遍即可.
但是复杂度相当可惜,和坐标系面积和举行个数以及矩形平均面积成正比.也就是说,如果坐标系范围在[-10000000,10000000]之间,就肯定过不了了.不仅过不了,而且存不下.10000x10000都困难.
有什么办法可以解决呢?注意n的值不大,所以有很多坐标数字都是不必须的,那么让我们"压缩"坐标系,将所有出现过的坐标都记录到一个hash数组中,那么就可以达到离散化的作用了.
附:color代码
#include #include struct rect{ int x1,x2,y1,y2,size,id;} rects[100];inline bool cmp(rect a,rect b){ return (a.size>b.size?true:(a.size==b.size?(a.id<b.id):false));}inline bool cmp2(rect a,rect b){ return a.id<b.id;}int n,a,i,j,xx,yy;int xs[30000],ys[30000],xp[30000],yp[30000],xa,ya;int map[400][400];bool pss[400];int main(){ freopen("color.in","r",stdin); freopen("color.out","w",stdout); scanf("%d %d",&n,&a); for(i=0;i<n;++i){ scanf("%d %d %d %d",&rects[i].x1,&rects[i].y1,&rects[i].x2,&rects[i].y2); rects[i].id=i; (rects+i)->x1+=15000; (rects+i)->x2+=15000; (rects+i)->y1+=15000; (rects+i)->y2+=15000; xs[(rects+i)->x1]=1; xs[(rects+i)->x2]=1; ys[(rects+i)->y1]=1; ys[(rects+i)->y2]=1; } xs[0]=ys[0]=1; xs[30000]=ys[30000]=1; j=0; for(i=0;i<=30000;++i) if(xs[i]) xp[(xs[i]=j++)]=i; xa=j; j=0; for(i=0;i<=30000;++i) if(ys[i]) yp[(ys[i]=j++)]=i; ya=j; for(i=0;i<n;++i){ (rects+i)->x1=xs[(rects+i)->x1]; (rects+i)->x2=xs[(rects+i)->x2]; (rects+i)->y1=ys[(rects+i)->y1]; (rects+i)->y2=ys[(rects+i)->y2]; for(xx=rects[i].x1;xx<rects[i].x2;++xx){ for(yy=rects[i].y1;yy<rects[i].y2;++yy){ map[xx][yy]=i+1; } } } for(xx=0;xx<xa;++xx){ for(yy=0;yy<ya;++yy){ if(map[xx][yy]){ rects[map[xx][yy]-1].size+=(xp[xx+1]-xp[xx])*(yp[yy+1]-yp[yy]); } } } std::sort(rects,rects+n,cmp); for(i=0;i<a;++i){ pss[rects[i].id]=true; } for(i=0;i<n;++i){ if(pss[i]) printf("%d ",i); } return 0;}
离散化的应用:矩形覆盖问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。