98 矩形面积 II(850)

作者: Turbo时间限制: 1S章节: 线段树

晚于: 2020-09-09 12:00:00后提交分数乘系数50%

问题描述 :

我们给出了一个(轴对齐的)矩形列表 rectangles 。 对于 rectangle[i] = [x1, y1, x2, y2],其中(x1,y1)是矩形 i 左下角的坐标,(x2,y2)是该矩形右上角的坐标。

找出平面中所有矩形叠加覆盖后的总面积。 由于答案可能太大,请返回它对 10 ^ 9 + 7 取模的结果。

 

示例 1:

输入:[[0,0,2,2],[1,0,2,3],[1,0,3,1]]

输出:6

解释:如图所示。

 

示例 2:

输入:[[0,0,1000000000,1000000000]]

输出:49

解释:答案是 10^18 对 (10^9 + 7) 取模的结果, 即  49 。

 

输入说明 :

首先输入矩形列表 rectangles的长度n

然后输入n行,每行表示一个矩形的坐标[x1, y1, x2, y2]

1 <= n <= 50

0 <= x1, y1, x2, y2 <= 10^9

矩形叠加覆盖后的总面积不会超越 2^63 - 1 ,这意味着可以用一个 64 位有符号整数来保存面积结果。

 

输出说明 :

输出结果

输入范例 :

输出范例 :

#include <iostream>
#include <vector>
#include <set>
#include <algorithm> 
#include <map>
using namespace std;
class Solution {
public:
    int rectangleArea(vector<vector<int>>& rectangles) {
        vector<int> vx;
        vector<int> vy;
        int i, j,k;
        for (i = 0; i < rectangles.size(); i++) {
            for (j = 0; j < vx.size(); j++) {
                if (vx[j] > rectangles[i][0]) { break; }
            }
            if (j == 0 || vx[j-1] < rectangles[i][0]) {vx.insert(vx.begin() + j, rectangles[i][0]);}

            for (j = 0; j < vy.size(); j++) {
                if (vy[j] > rectangles[i][1]) { break; }
            }
            if (j == 0 || vy[j - 1] < rectangles[i][1]) { vy.insert(vy.begin() + j, rectangles[i][1]); }

            for (j = 0; j < vx.size(); j++) {
                if (vx[j] > rectangles[i][2]) { break; }
            }
            if (j == 0 || vx[j - 1] < rectangles[i][2]) { vx.insert(vx.begin() + j, rectangles[i][2]); }

            for (j = 0; j < vy.size(); j++) {
                if (vy[j] > rectangles[i][3]) { break; }
            }
            if (j == 0 || vy[j - 1] < rectangles[i][3]) { vy.insert(vy.begin() + j, rectangles[i][3]); }
        }

        long long ans = 0;
        for (i = 1; i < vx.size(); i++) {
            for (j = 1; j < vy.size(); j++) {
                for (k = 0; k < rectangles.size(); k++) {
                    if (vx[i - 1] >= rectangles[k][0]
                        && vy[j - 1] >= rectangles[k][1]
                        && vx[i] <= rectangles[k][2]
                        && vy[j] <= rectangles[k][3]) {
                        ans += (long long)(vx[i] - vx[i - 1]) * (long long)(vy[j] - vy[j - 1]) % (1000000000 + 7);
                        ans %= (1000000000 + 7);
                        break;
                    }
                }
            }
        }
        ans %= (1000000000 + 7);
        return ans;
    }
};

int main()
{
    int n,m;
    cin>>n;
    vector<vector<int>> buildings;
    for(int i=0;i<n;i++)
    {
        vector<int> row;
        for(int j=0;j<4;j++)
        {
            cin>>m;
            row.push_back(m);
        }
        buildings.push_back(row);
    }
    int res=Solution().rectangleArea(buildings);
    
    cout<<res;
    
}

 

posted on 2020-09-15 21:16  Hi!Superman  阅读(162)  评论(0编辑  收藏  举报

导航