题意:在二维平面上给出n个矩形的顶点坐标(浮点数),每个矩形的边都平行坐标轴,求矩形覆盖的面积。
数据范围:n<=100, 0=<x,y<=100000
分析:由于n比较小,所以用离散化就能过(离散化的具体分析见上一篇)。
View Code
#include <stdio.h> #include <string.h> #include <stdlib.h> #define N 110 int n; double xl[N],yl[N]; double xr[N],yu[N]; double x[2*N],y[2*N]; int xcnt,ycnt; bool flag[2*N][2*N]; int cmp(const void *a,const void *b) { return *(double*)a>*(double*)b?1:-1; } void init() { xcnt=ycnt=0; memset(flag,0,sizeof(flag)); } void read() { double a,b,c,d; for(int i=0;i<n;i++) { scanf("%lf%lf%lf%lf",&a,&b,&c,&d); xl[i]=a; yl[i]=b; xr[i]=c; yu[i]=d; x[xcnt++]=a; x[xcnt++]=c; y[ycnt++]=b; y[ycnt++]=d; } } int bsx(double k) { int min=0,max=xcnt,mid; while(min+1!=max) { mid=min+max>>1; if(x[mid]>k) max=mid; else min=mid; } return min; } int bsy(double k) { int min=0,max=ycnt,mid; while(min+1!=max) { mid=min+max>>1; if(y[mid]>k) max=mid; else min=mid; } return min; } void solve() { int i,j,k; qsort(x,xcnt,sizeof(x[0]),cmp); qsort(y,ycnt,sizeof(y[0]),cmp); k=xcnt; xcnt=0; x[xcnt++]=x[0]; for(i=1;i<k;i++) if(x[xcnt-1]!=x[i]) x[xcnt++]=x[i]; k=ycnt; ycnt=0; y[ycnt++]=y[0]; for(i=1;i<k;i++) if(y[ycnt-1]!=y[i]) y[ycnt++]=y[i]; int a,b,c,d; for(k=0;k<n;k++) { a=bsx(xl[k]); b=bsy(yl[k]); c=bsx(xr[k]); d=bsy(yu[k]); for(i=a;i<c;i++) { for(j=b;j<d;j++) flag[i][j]=true; } } double ans=0; for(i=0;i<xcnt-1;i++) { for(j=0;j<ycnt-1;j++) if(flag[i][j]) ans+=(x[i+1]-x[i])*(y[j+1]-y[j]); } printf("Total explored area: %.2lf\n\n",ans); } int main() { int kase=0; while(scanf("%d",&n),n) { init(); read(); printf("Test case #%d\n",++kase); solve(); } return 0; }