题意 : 就是给你n个矩形的最左下角和最右上角的点的坐标,然后将这n个矩形的面积求出来。
思路 : 离散化求矩形面积并。离散化具体介绍。将横纵坐标离散开来分别存,然后排序,也可以按照黑书上411页写的两个算法中,有一个说是用二分,效率比较好,不过我用的不是二分,而是普通的循环查找。

1 #include<iostream> 2 #include <algorithm> 3 #include <string.h> 4 #include <stdio.h> 5 using namespace std; 6 double x[201],y[201],s[101][4]; 7 int flag[201][201]; 8 int t,cas = 1 ; 9 double sum; 10 int main() 11 { 12 while(~scanf("%d",&t)) 13 { 14 if(t == 0) break; 15 int k = 0 ; 16 sum = 0.0 ; 17 memset(flag,0,sizeof(flag)); 18 for(int i = 1 ; i <= n ; i++) 19 { 20 cin>>s[i][0]>>s[i][1]>>s[i][2]>>s[i][3]; 21 x[k] = s[i][0]; 22 y[k] = s[i][1]; 23 k++; 24 x[k] = s[i][2]; 25 y[k] = s[i][3]; 26 k++; 27 } 28 sort(x,x+2*n); 29 sort(y,y+2*n); 30 for(k = 1 ; k <= n ; k++) 31 { 32 int a,b,c,d; 33 for(a = 0 ; a < 2*n ; a++) 34 if(x[a] == s[k][0]) break; 35 for(b = 0 ; b < 2*n ; b++) 36 if(x[b] == s[k][2]) break; 37 for(c = 0 ; c < 2*n ; c++) 38 if(y[c] == s[k][1]) break; 39 for(d = 0 ; d < 2*n ; d++) 40 if(y[d] == s[k][3]) break; 41 for(int i = a ; i < b ; i++) 42 for(int j = c ; j < d ; j++) 43 flag[i][j] = 1 ; 44 } 45 for(int i = 0 ; i < 2*t ; i++) 46 for(int j = 0 ; j < 2*t ; j++) 47 if(flag[i][j]) 48 sum+=(x[i+1]-x[i])*(y[j+1]-y[j]); 49 printf("Test case #%d ",cas++); 50 printf("Total explored area: %.2f ",sum); 51 } 52 return 0; 53 }