zoukankan      html  css  js  c++  java
  • 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;
        
    }
  • 相关阅读:
    美团面试(c++方向)
    浪潮面试-软开
    ofo C++面试
    B树、B+树等
    爱奇艺2017秋招笔试(C++智能设备方向)
    腾讯内推一面C++
    i++ 相比 ++i 哪个更高效?为什么?
    进程间的通讯(IPC)方式
    一台服务器能够支持多少TCP并发连接呢?
    可重入和不可重入
  • 原文地址:https://www.cnblogs.com/zmmm/p/13675717.html
Copyright © 2011-2022 走看看