HDU 1264 Counting Squares(Hash)或者(线段树+线扫描)

Posted y-meng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 1264 Counting Squares(Hash)或者(线段树+线扫描)相关的知识,希望对你有一定的参考价值。

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 }

 

以上是关于HDU 1264 Counting Squares(Hash)或者(线段树+线扫描)的主要内容,如果未能解决你的问题,请参考以下文章

HDU 1264 Counting Squares(Hash)或者(线段树+线扫描)

D - Counting Squares

Lake Counting

Lake Counting

Lake Counting

poj 2386Lake Counting