zoukankan      html  css  js  c++  java
  • POJ 1151 Atlantis (离散化求矩形面积并)

    题意:在二维平面上给出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;
    }
  • 相关阅读:
    【转】一个java处理JSON格式数据的通用类
    Oracle数据类型Clob读取
    【网摘】Ibatis调用存储过程
    jQuery实现页面模块拖拽与模块自定义效果.rar
    jspSmartUpload上传下载全攻略
    【转】JSON 入门指南
    【摘选自江苏移动网上营业厅】JS实现无间断向上滚动marquee
    Oracle用户解锁
    js 蒙版进度条(图片)
    java文件夹遍历
  • 原文地址:https://www.cnblogs.com/algorithms/p/2623875.html
Copyright © 2011-2022 走看看