HDU 3265 Posters

矩形面积并,一个拆成四个

#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<algorithm>
using namespace std;

const long long maxn=100000+10;
struct Seg
{
    long long x;
    long long Y1,Y2;//离散化之后的坐标
    long long flag;
}s[8*maxn];
long long X1[8*maxn],X2[8*maxn],Y1[8*maxn],Y2[8*maxn];
map<long long ,long long>m;
long long M[8*maxn];long long k;
long long n,tot,N;
long long sum,ans;

struct SegTree
{
    long long len;
    long long cover;
} segTree[maxn*4];

bool cmp(const Seg&a,const Seg&b)
{
    return a.x<b.x;
}

void lsh()
{
    k=0;
    m.clear();
    for(long long i=0; i<N; i++)
    {
        if(m[Y1[i]]==0) M[k++]=Y1[i],m[Y1[i]]=1;
        if(m[Y2[i]]==0) M[k++]=Y2[i],m[Y2[i]]=1;
    }
    sort(M,M+k);
    m.clear();
    for(long long i=0; i<k; i++) m[M[i]]=i;
}

void build(long long l,long long r,long long rt)
{
    segTree[rt].cover=0;
    segTree[rt].len=0;
    if(l==r) return;
    long long m=(l+r)/2;
    build(l,m,2*rt);
    build(m+1,r,2*rt+1);
}

void pushUp(long long rt,long long l,long long r)
{
    if(segTree[rt].cover) segTree[rt].len=M[r]-M[l-1];
    else segTree[rt].len=segTree[2*rt].len+segTree[2*rt+1].len;
}

void update(long long info,long long L,long long R,long long l,long long r,long long rt)
{
    if(L<=l&&r<=R)
    {
        segTree[rt].cover=segTree[rt].cover+info;
        pushUp(rt,l,r);
        return;
    }

    long long m=(l+r)/2;
    if(L<=m) update(info,L,R,l,m,2*rt);
    if(R>m)  update(info,L,R,m+1,r,2*rt+1);
    pushUp(rt,l,r);
}

int main()
{

    while(~scanf("%lld",&n))
    {
        if(n==0) break;
        N=0;
        for(long long i=1; i<=n; i++)
        {
            long long a1,a2,a3,a4,b1,b2,b3,b4;
            scanf("%lld%lld%lld%lld%lld%lld%lld%lld",&a1,&b1,&a2,&b2,&a3,&b3,&a4,&b4);
            if(b3>b1&&a2>a1){
            X1[N]=a1,Y1[N]=b1;
            X2[N]=a2,Y2[N]=b3;
            N++;}

            if(b2>b4&&a2>a1){
            X1[N]=a1,Y1[N]=b4;
            X2[N]=a2,Y2[N]=b2;
            N++;}

            if(a3>a1&&b4>b3){
            X1[N]=a1,Y1[N]=b3;
            X2[N]=a3,Y2[N]=b4;
            N++;}

            if(a2>a4&&b4>b3){
            X1[N]=a4,Y1[N]=b3;
            X2[N]=a2,Y2[N]=b4;
            N++;}
        }
        if(N==0)
        {
            printf("0
");
            continue;
        }
        lsh();

        tot=0;
        for(long long i=0; i<N; i++)
        {
            s[tot].x=X1[i],s[tot].Y1=m[Y1[i]],s[tot].Y2=m[Y2[i]],s[tot].flag=1,tot++;
            s[tot].x=X2[i],s[tot].Y1=m[Y1[i]],s[tot].Y2=m[Y2[i]],s[tot].flag=-1,tot++;
        }
        sort(s,s+tot,cmp);

        ans=0;

        build(1,k,1);
        update(s[0].flag,s[0].Y1+1,s[0].Y2,1,k,1);
        for(long long i=1; i<tot; i++)
        {
            sum=segTree[1].len;
            ans=ans+sum*(s[i].x-s[i-1].x);
            update(s[i].flag,s[i].Y1+1,s[i].Y2,1,k,1);
        }

        printf("%lld
",ans);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/zufezzt/p/5056148.html