离散化 和多维线段树

poj 1151 离散化

分类: 练习 196人阅读 评论(0) 收藏 举报
ACM C 数据结构 离散化

http://poj.org/problem?id=1151

题目大意:给出 n 个矩形的“左下”和“右上”顶点坐标,求面积并;

思路:由于坐标值为实数,所以不能直接用数组模拟,要先将所有坐标值离散化处理;

[cpp] view plain copy print ?
  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<stdlib.h>
  5. #include<algorithm>
  6. using namespace std;
  7. #define SIZE 103<<1
  8. double a[SIZE][4],x[SIZE],y[SIZE];
  9. int map[SIZE][SIZE];
  10. int main()
  11. {
  12. int T=1,n,i,j,l,k;
  13. int x1,y1,x2,y2;
  14. while(scanf("%d",&n),n){
  15. for(i=0,k=0;i<n;i++){
  16. scanf("%lf%lf%lf%lf",&a[i][0],&a[i][1],&a[i][2],&a[i][3]);
  17. x[k]=a[i][0];
  18. y[k]=a[i][1];
  19. k++;
  20. x[k]=a[i][2];
  21. y[k]=a[i][3];
  22. k++;
  23. }
  24. sort(x,x+k);
  25. sort(y,y+k);
  26. memset(map,0,sizeof(map));
  27. for(i=0;i<n;i++){
  28. for(x1=0;x1<k;x1++){
  29. if(x[x1]==a[i][0])
  30. break;
  31. }
  32. for(y1=0;y1<k;y1++){
  33. if(y[y1]==a[i][1])
  34. break;
  35. }
  36. for(x2=0;x2<k;x2++){
  37. if(x[x2]==a[i][2])
  38. break;
  39. }
  40. for(y2=0;y2<k;y2++){
  41. if(y[y2]==a[i][3])
  42. break;
  43. }
  44. for(l=x1;l<x2;l++){
  45. for(j=y1;j<y2;j++){
  46. map[l][j]=1;
  47. }
  48. }
  49. }
  50. double sum=0;
  51. for(i=0;i<k-1;i++){
  52. for(j=0;j<k-1;j++){
  53. if(map[i][j]==1){
  54. sum+=(x[i+1]-x[i])*(y[j+1]-y[j]);
  55. }
  56. }
  57. }
  58. printf("Test case #%d\n",T++);
  59. printf("Total explored area: %.2lf\n\n",sum);
  60. }
  61. return 0;
  62. }

你可能感兴趣的:(练习)