zoukankan      html  css  js  c++  java
  • 图形面积 [离散]

    题目

       

    图形面积

    Time Limit:1000MS  Memory Limit:65536K
    Total Submit:23 Accepted:13

    Description

    桌面上放了N个平行于坐标轴的矩形,这N个矩形可能有互相覆盖的部分,求它们组成的图形的面积。

    Input

    输入第一行为一个数N(1≤N≤100),表示矩形的数量。下面N行,每行四个整数,分别表示每个矩形的左下角和右上角的坐标,坐标范围为–10^8到10^8之间的整数。

    Output

    输出只有一行,一个整数,表示图形的面积。

    Sample Input

    3
    1 1 4 3
    2 -1 3 2
    4 0 5 2

    Sample Output

    10

    分析

      

    平常的想法就是开一个与二维坐标规模相当的二维Boolean数组模拟矩形的“覆盖”(把矩形所在的位置填上True)。可惜这个想法在这里有些问题,因为这个题目中坐标范围相当大(坐标范围为-10^8到10^8之间的整数)。但我们发现,矩形的数量n<=100远远小于坐标范围。每个矩形会在横纵坐标上各“使用”两个值, 100个矩形的坐标也不过用了-10^8到10^8之间的200个值。也就是说,实际有用的值其实只有这么几个。这些值将作为新的坐标值重新划分整个平面,省去中间的若干坐标值没有影响。我们可以将坐标范围“离散化”到1到200之间的数,于是一个200*200的二维数组就足够了。实现方法正如本文开头所说的“排序后处理”。对横坐标(或纵坐标)进行一次排序并映射为1到2n的整数,同时记录新坐标的每两个相邻坐标之间在离散化前实际的距离是多少。这道题同样有优化的余地。

    代码

    #include<iostream>
    #include<algorithm>
    using namespace std;
    long long x1[101],x2[101],y1[101],y2[101],x[1010],y[1010];
    int main ()
    {
        int n;
        cin>>n;
        for (int i=1;i<=n;i++)
        {
            cin>>x1[i]>>y1[i]>>x2[i]>>y2[i];
            x[2*i]=x1[i]; //离散 
            x[2*i-1]=x2[i];
            y[2*i]=y1[i];
            y[2*i-1]=y2[i];
        }
        sort(x+1,x+1+n*2);
        sort(y+1,y+1+n*2);
        long long ans=0;
        for (int i=1;i<=2*n-1;i++)
          for (int j=1;j<=2*n-1;j++)
          {
             long long s=(x[i+1]-x[i])*(y[j+1]-y[j]);
                for (int k=1;k<=n;k++)
                {
                    if (x[i]>=x1[k]&&y[j]>=y1[k]&&x[i+1]<=x2[k]&&y[j+1]<=y2[k])  //离散化 
                    {
                        ans=ans+s;
                        break;
                    }
                }
          }
        cout<<ans;
    }
    为何要逼自己长大,去闯不该闯的荒唐
  • 相关阅读:
    java。多态
    java。构造方法
    java.final修饰符l
    java。this的用法
    数据库:内连接与外连接区别
    Java工具类-设置字符编码
    Java工具类-验证码工具
    Java工具类-加密算法
    java中的object... args参数
    针对MySql封装的JDBC通用框架类(包含增删改查、JavaBean反射原理)
  • 原文地址:https://www.cnblogs.com/zjzjzj/p/10085519.html
Copyright © 2011-2022 走看看