作者:
晚于: 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; }