1. 程式人生 > >HDU 1264 Counting Squares(Hash)或者(線段樹+線掃描)

HDU 1264 Counting Squares(Hash)或者(線段樹+線掃描)

bsp pan 解決 printf 就是 大小 lag 線段 ash

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)或者(線段樹+線掃描)