Leetcode850-矩形面积 II

8 篇文章 0 订阅
2 篇文章 0 订阅

扫描线模板题。

class Solution {
public:
    const int mod=1e9+7;

    struct node1{
        int l,r,sum,lazy;
    }tr[210*8];

    struct node2{
        int x,y1,y2,tag;
        bool operator<(const node2 &b){
            return x<b.x;
        }
    };
    vector<node2> e;
    vector<int> s;

    int find(int y){
        return lower_bound(s.begin(),s.end(),y)-s.begin();
    }

    void pushup(int u){
        if(tr[u].lazy){
            tr[u].sum=s[tr[u].r+1]-s[tr[u].l];
        }else if(tr[u].l!=tr[u].r){
            tr[u].sum=tr[u<<1].sum+tr[u<<1|1].sum;
        }else tr[u].sum=0;
    }

    void build(int u,int l,int r){
        tr[u]={l,r,0,0};
        if(l==r) return;
        int m=(l+r)>>1;
        build(u<<1,l,m);
        build(u<<1|1,m+1,r);
    }

    void modify(int u,int l,int r,int tag){
        if(tr[u].l>=l&&tr[u].r<=r){
            tr[u].lazy+=tag;
            pushup(u);
            return;
        }
        int m=(tr[u].l+tr[u].r)>>1;
        if(l<=m) modify(u<<1,l,r,tag);
        if(r>m) modify(u<<1|1,l,r,tag);
        pushup(u);
    }

    int rectangleArea(vector<vector<int>>& rectangles) {
        int n=rectangles.size();
        for(auto r:rectangles){
            e.push_back({r[0],r[1],r[3],1});
            e.push_back({r[2],r[1],r[3],-1});
            s.push_back(r[1]);
            s.push_back(r[3]);
        }
        sort(s.begin(),s.end());
        s.erase(unique(s.begin(),s.end()),s.end());
        sort(e.begin(),e.end());
        build(1,0,2*n);
        long long ans=0;
        for(int i=0;i<e.size();i++){
            if(i) (ans+=1LL*tr[1].sum*(e[i].x-e[i-1].x))%=mod;
            modify(1,find(e[i].y1),find(e[i].y2)-1,e[i].tag);
        }
        return ans;
    }
};

时间复杂度:O(nlogn)。

空间复杂度:O(n)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值