扫描线

#include<iostream>
#include <algorithm> 
#define ls now<<1
#define rs now<<1|1
#define ll long long
using namespace std;
const int MM=1000005;
ll n,x1,x2,y1,y2,x[MM],t[MM<<2],len[MM<<2],ans,tot;
struct scanline
{
    int l,r,h,q;
}line[MM];
bool cmp(scanline a,scanline b)
{
    return a.h<b.h;
}
void pushup(int now,int l,int r)
{
    if(t[now])
        len[now]=x[r+1]-x[l];
    else
        len[now]=len[ls]+len[rs];
}
void add(int now,int l,int r,int L,int R,int k)
{
    if(x[r+1]<=L||x[l]>=R)
        return;
    if(x[l]>=L&&x[r+1]<=R)
    {
        t[now]+=k;
        pushup(now,l,r);
        return;
    }
    int mid=(l+r)>>1;
    add(ls,l,mid,L,R,k);
    add(rs,mid+1,r,L,R,k);
    pushup(now,l,r);
}

int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>x1>>y1>>x2>>y2;
        x[2*i-1]=x1,x[2*i]=x2;
        line[2*i-1]=(scanline){x1,x2,y1,1};
        line[2*i]=(scanline){x1,x2,y2,-1};
    }
    n=n<<1;
    sort(line+1,line+n+1,cmp);
    sort(x+1,x+n+1);
    ll tot=unique(x+1,x+n+1)-x-1;
    ll ans=0;
    for(int i=1;i<n;i++)
    {
        add(1,1,tot-1,line[i].l,line[i].r,line[i].q);
        ans+=len[1]*(line[i+1].h-line[i].h);
    }
    cout<<ans;
    return 0;
}

 

posted @ 2021-09-28 13:54  T_X蒻  阅读(29)  评论(0编辑  收藏  举报