扫描线

题目链接

https://leetcode.cn/problems/rectangle-area-ii/

题目大意

image

题目思路

题目代码

#define ll long long
const int MOD = 1e9 + 7;
class Solution {
public:
    int rectangleArea(vector<vector<int>>& rectangles) {
        vector<int> x_axis;
        for(auto x:rectangles){
            x_axis.push_back(x[0]);
            x_axis.push_back(x[2]);
        }
        sort(x_axis.begin(),x_axis.end());
        ll ans = 0;
        for(int i = 0;i < x_axis.size() - 1;++i){
            int left = x_axis[i],right = x_axis[i + 1];
            int w = right - left;
            if(w == 0) continue;
            vector<array<int,2>> y_axis;
            for(auto x:rectangles){
                if(x[0] <= left && right <= x[2])
                    y_axis.push_back({x[1],x[3]});
            }
            sort(y_axis.begin(),y_axis.end());
            int h = 0,l = -1,r = -1;
            for(auto y:y_axis){
                if(y[0] > r){
                    h += r - l;
                    l = y[0],r = y[1];
                }else if(y[1] > r){
                    r = y[1];
                }
            }
            h += r - l;
            ans = (ans  + (ll)w * h) % MOD;
        }
        return ans;
    }
};
posted @ 2024-05-04 15:30  gebeng  阅读(12)  评论(0)    收藏  举报