POJ 1151 矩形面积并

题解:
把横坐标离散化,然后把矩形拆成上下两条边,上边标成-1,下边标成1,然后按情况增减面积即可~

 

View Code
 1 #include <iostream>

 2 #include <cstring>

 3 #include <cstdio>

 4 #include <cstdlib>

 5 #include <algorithm>

 6 

 7 #define N 222

 8 

 9 using namespace std;

10 

11 struct LI

12 {

13     double y,sx,tx;

14     int nsx,ntx,fg;

15 }li[N<<1];

16 

17 int gs,cs,cnt,n,cas;

18 int c[N<<1];

19 double a[N<<1],ans;

20 

21 inline bool cmp(const LI &a,const LI &b)

22 {

23     return a.y<b.y;

24 }

25 

26 inline void read()

27 {

28     gs=cs=0;double tx,ty,sx,sy;

29     for(int i=1;i<=n;i++)

30     {

31         scanf("%lf%lf%lf%lf",&sx,&sy,&tx,&ty);

32         a[++gs]=sx; a[++gs]=tx;

33         li[++cs].y=sy; li[cs].sx=sx; li[cs].tx=tx; li[cs].fg=-1;

34         li[++cs].y=ty; li[cs].sx=sx; li[cs].tx=tx; li[cs].fg=1;

35     }

36     sort(li+1,li+1+cs,cmp);

37     sort(a+1,a+1+gs);

38     cnt=unique(a+1,a+1+gs)-a-1;

39     for(int i=1;i<=cs;i++)

40     {

41         li[i].nsx=lower_bound(a+1,a+1+cnt,li[i].sx)-a;

42         li[i].ntx=lower_bound(a+1,a+1+cnt,li[i].tx)-a;

43     }

44 }

45 

46 inline void go()

47 {

48     memset(c,0,sizeof c);

49     ans=0.0;

50     for(int i=1;i<=cs;i++)

51         for(int j=li[i].nsx;j<li[i].ntx;j++)

52         {

53             if(li[i].fg==-1)

54             {

55                 c[j]--;

56                 if(c[j]==-1) ans-=(a[j+1]-a[j])*li[i].y;

57             }

58             else

59             {

60                 c[j]++;

61                 if(c[j]==0) ans+=(a[j+1]-a[j])*li[i].y;

62             }

63         }

64     printf("Test case #%d\n",++cas);

65     printf("Total explored area: %.2lf\n\n",ans);

66 }

67 

68 int main()

69 {

70     while(scanf("%d",&n),n) read(),go();

71     return 0;

72 }

 

 

你可能感兴趣的:(poj)