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 }
没有人能阻止我前进的步伐,除了我自己!