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 }
原文地址:https://www.cnblogs.com/proverbs/p/2924581.html