http://acm.hdu.edu.cn/showproblem.php?pid=1264
题意:给你矩形的左下角和右上角两个坐标,让你求这些矩形覆盖的面积的大小!~
分析:一看就是线段树+线扫描的问题,其实如果你仔细看一下就会发现还有简单的方法解决它,因为题目所给的坐标值在0~100之间的整数,
这样我们就可以用Hash[][]来表示1*1矩形的个数,Hash[i][j]表示以坐标值(i,j)为左下角1*1的矩形是否被覆盖,这样我们就可以用Hash二维数组表示平面上1*1矩形个数.
注意:我们要求输入要按照x1<x2&&y1<y2的形式输入,如果不是swap一下就可以。还有就是在标记Hash[][]数组的时候注意x2,y2这两个端点不能选取的!自己想一下就知道的.
1 #include<cstdio> 2 #include<algorithm> 3 #include<string.h> 4 using namespace std; 5 6 int Hash[111][111]; 7 8 int main() 9 { 10 int x1,y1,x2,y2; 11 int flag=1; 12 while(flag) 13 { 14 memset(Hash,0,sizeof(Hash)); 15 16 while(~scanf("%d%d%d%d",&x1,&y1,&x2,&y2)) 17 { 18 if(x1==-1&&y1==-1&&x2==-1&&y2==-1) 19 break; 20 if(x1==-2&&y1==-2&&x2==-2&&y2==-2) 21 { 22 flag=0; 23 break; 24 } 25 if(x1>x2) 26 swap(x1,x2); 27 if(y1>y2) 28 swap(y1,y2); 29 for(int i=x1; i<x2; i++)///注意这里是没有取等号的 30 for(int j=y1; j<y2; j++)///同上 31 Hash[i][j]=1; 32 } 33 int ans=0; 34 for(int i=0; i<=100; i++) 35 for(int j=0; j<=100; j++) 36 if(Hash[i][j]) 37 ans++; 38 printf("%d\n",ans); 39 } 40 }