BZOJ 1513 [POI2006]Tet-Tetris 3D

题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1513

题意:三维空间,有一些立方体在垂直下落。立方体的左下角坐标(x,y)以及长宽高d,s,w。A落在B上时将停止下落(即使A只有一小块跟B重合就算A会落在B上)。求最后最大的高度。

思路:每次覆盖时找到区域最大值,加上当前立方体的高度。

int xL,xR,yL,yR;

int h;

 

int n,m;

 

struct Seg

{

    int f[N<<1],s[N<<1];

 

    void insert(int t,int L,int R,int ll,int rr,int h)

    {

        f[t]=max(f[t],h);

        if(L==ll&&R==rr)

        {

            s[t]=max(s[t],h);

            return;

        }

        int M=(L+R)>>1;

        if(rr<=M) insert(t<<1,L,M,ll,rr,h);

        else if(ll>M) insert(t<<1|1,M+1,R,ll,rr,h);

        else

        {

            insert(t<<1,L,M,ll,M,h);

            insert(t<<1|1,M+1,R,M+1,rr,h);

        }

    }

 

    int query(int t,int L,int R,int ll,int rr)

    {

        if(L==ll&&R==rr) return f[t];

 

        int ans=s[t];

        int M=(L+R)>>1;

        if(rr<=M) upMax(ans,query(t<<1,L,M,ll,rr));

        else if(ll>M) upMax(ans,query(t<<1|1,M+1,R,ll,rr));

        else

        {

            upMax(ans,query(t<<1,L,M,ll,M));

            upMax(ans,query(t<<1|1,M+1,R,M+1,rr));

        }

        return ans;

    }

};

 

 

struct Seg1

{

    Seg f[N<<1],s[N<<1];

 

    void insert(int t,int L,int R,int ll,int rr)

    {

        f[t].insert(1,1,m,yL,yR,h);

        if(L==ll&&R==rr)

        {

            s[t].insert(1,1,m,yL,yR,h);

            return;

        }

        int M=(L+R)>>1;

        if(rr<=M) insert(t<<1,L,M,ll,rr);

        else if(ll>M) insert(t<<1|1,M+1,R,ll,rr);

        else

        {

            insert(t<<1,L,M,ll,M);

            insert(t<<1|1,M+1,R,M+1,rr);

        }

    }

 

    int query(int t,int L,int R,int ll,int rr)

    {

        if(L==ll&&R==rr) return f[t].query(1,1,m,yL,yR);

        int ans=s[t].query(1,1,m,yL,yR);

        int M=(L+R)>>1;

        if(rr<=M) upMax(ans,query(t<<1,L,M,ll,rr));

        else if(ll>M) upMax(ans,query(t<<1|1,M+1,R,ll,rr));

        else

        {

            upMax(ans,query(t<<1,L,M,ll,M));

            upMax(ans,query(t<<1|1,M+1,R,M+1,rr));

        }

        return ans;

    }

};

 

Seg1 a;

 

int Q;

 

int main()

{

    RD(n,m,Q);

    while(Q--)

    {

        int d,s,w,x,y;

        scanf("%d%d%d%d%d",&d,&s,&w,&x,&y);

        xL=x+1;

        xR=x+d;

        yL=y+1;

        yR=y+s;

        h=a.query(1,1,n,xL,xR);

        h+=w;

        a.insert(1,1,n,xL,xR);

    }

    xL=yL=1;

    xR=n;

    yR=m;

    int ans=a.query(1,1,n,1,n);

    printf("%d\n",ans);

}

 

你可能感兴趣的:(poi)