zoukankan      html  css  js  c++  java
  • 【BZOJ1513】[POI2006]Tet-Tetris 3D 二维线段树

    【BZOJ1513】[POI2006]Tet-Tetris 3D

    Description

    Task: Tetris 3D "Tetris" 游戏的作者决定做一个新的游戏, 一个三维的版本, 在里面很多立方体落在平面板,一个立方体开始落下直到碰上一个以前落下的立方体或者落地即停止. 作者想改变一下游戏的目的使得它更大众化,在新游戏中你将知道落下的立方体信息以及位置,你的任务就是回答所有立方体落下后最高的方块的高度.所有的立方体在下落过程中都是垂直的并且不会旋转.平板左下角坐标为原点,并且平行于坐标轴.

    Input

    第一行给出三个整数 D, S and N ( 1<= N<= 20 000, 1<= D, S <=1 000), 分别表示平板的长和宽以及下落立方体的数目. 接下来N 行每行描述一个立方体. 每行包含5个整数: d, s, w, x and y (1<= d, 0 <=x, d + x<= D, 1 <=s, 0<= y, s + y<= S, 1<= w <=100 000), 分别表示立方体的长宽高以及落下的左下角坐标, 长和宽都是平行于平板坐标轴的,落下后立方体着地的四个角坐标分别为: (x, y), (x + d, y), (x, y + s) and (x + d, y + s).

    Output

    一个整数表示所有立方体落下后最高的方块的高度.

    Sample Input

    7 5 4
    4 3 2 0 0
    3 3 1 3 0
    7 1 2 0 3
    2 3 3 2 2

    Sample Output

    6

    题解:还是给一个直来直去的题面吧:给你一个平面,每次将一个矩形中的所有数改为(矩形中的最大数+w),问n次操作后平面内最大的数是多少。

    看题面就知道一定是要用二维线段树的,不过二维线段树必须标记永久化。标记永久化这个词对本蒟蒻来说倒是比较陌生,不过仔细想想以前也的确做过许多用到标记永久化的思想的题。

    说白了,就是在区间更新和区间查询的时候,免去pushup和pushdown操作,而是改为:更新的时候,修改沿路的所有pushup的标记,并修改目标节点的pushdown标记;查询的时候,查询沿路的所有pushdown标记,并查询目标节点的pushup标记。

    哦,对了,必须标记永久化 说的是外层线段树,内层线段树还是可以正常搞的。

    此外本题略微卡空间~

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #define lson x<<1
    #define rson x<<1|1
    using namespace std;
    const int maxn=1010;
    int n,D,S;
    int rup[maxn<<2],rdn[maxn<<2];
    struct sag
    {
    	int sm[maxn<<12],tag[maxn<<12],ls[maxn<<12],rs[maxn<<12],tot;
    	void pushdown(int x)
    	{
    		if(tag[x])
    		{
    			if(!ls[x])	ls[x]=++tot;
    			if(!rs[x])	rs[x]=++tot;
    			sm[ls[x]]=max(sm[ls[x]],tag[x]),tag[ls[x]]=max(tag[ls[x]],tag[x]);
    			sm[rs[x]]=max(sm[rs[x]],tag[x]),tag[rs[x]]=max(tag[rs[x]],tag[x]);
    			tag[x]=0;
    		}
    	}
    	void updata(int l,int r,int &x,int a,int b,int c)
    	{
    		if(!x)	x=++tot;
    		if(a<=l&&r<=b)
    		{
    			sm[x]=max(sm[x],c),tag[x]=max(tag[x],c);
    			return ;
    		}
    		pushdown(x);
    		int mid=l+r>>1;
    		if(a<=mid)	updata(l,mid,ls[x],a,b,c);
    		if(b>mid)	updata(mid+1,r,rs[x],a,b,c);
    		sm[x]=max(sm[ls[x]],sm[rs[x]]);
    	}
    	int query(int l,int r,int x,int a,int b)
    	{
    		if(!x)	return 0;
    		if(a<=l&&r<=b)	return sm[x];
    		pushdown(x);
    		int mid=l+r>>1;
    		if(b<=mid)	return query(l,mid,ls[x],a,b);
    		if(a>mid)	return query(mid+1,r,rs[x],a,b);
    		return max(query(l,mid,ls[x],a,b),query(mid+1,r,rs[x],a,b));
    	}
    }sup,sdn;
    void modify(int l,int r,int x,int a,int b,int c,int d,int e)
    {
    	sup.updata(1,S,rup[x],c,d,e);
    	if(a<=l&&r<=b)
    	{
    		sdn.updata(1,S,rdn[x],c,d,e);
    		return ;
    	}
    	int mid=l+r>>1;
    	if(a<=mid)	modify(l,mid,lson,a,b,c,d,e);
    	if(b>mid)	modify(mid+1,r,rson,a,b,c,d,e);
    }
    int ask(int l,int r,int x,int a,int b,int c,int d)
    {
    	int mid=l+r>>1,ret=sdn.query(1,S,rdn[x],c,d);
    	if(a<=l&&r<=b)	ret=max(ret,sup.query(1,S,rup[x],c,d));
    	else
    	{
    		if(a<=mid)	ret=max(ret,ask(l,mid,lson,a,b,c,d));
    		if(b>mid)	ret=max(ret,ask(mid+1,r,rson,a,b,c,d));
    	}
    	return ret;
    }
    int rd()
    {
    	int ret=0,f=1;	char gc=getchar();
    	while(gc<'0'||gc>'9')	{if(gc=='-')f=-f;	gc=getchar();}
    	while(gc>='0'&&gc<='9')	ret=ret*10+gc-'0',gc=getchar();
    	return ret*f;
    }
    int main()
    {
    	D=rd(),S=rd(),n=rd();
    	int i,j,a,b,c,d,e;
    	for(i=1;i<=n;i++)
    	{
    		c=rd(),d=rd(),e=rd(),a=rd(),b=rd();
    		modify(1,D,1,a+1,a+c,b+1,b+d,ask(1,D,1,a+1,a+c,b+1,b+d)+e);
    	}
    	printf("%d",ask(1,D,1,1,D,1,S));
    	return 0;
    }

     

  • 相关阅读:
    ParallelsDesktop在windows 10虚拟机重启后分辨率无法保存的问题解决方案
    Windows10 2021年5月功能更新(21H1)的三种方式
    Database "mem:XXX" not found, either pre-create it or allow remote database creation (not recommended in secure environments) [90149-200] 90149/90149 解决方案
    Win7/8下提示OpenSCManager failed 拒绝访问 解决方案
    将 Windows 更新代理更新到最新版本
    解决Eclipse中无法直接使用sun.misc.BASE64Encoder及sun.misc.BASE64Decoder的问题
    【Windows】U 盘装系统,无法格式化所选磁盘分区[错误: 0x8004242d]解决方案
    Boot Camp列表-苹果电脑Windows驱动下载
    selenium4 Timeouts is deprecated
    Selenium4实践1——对比Selenium3,Selenium4更新了什么?
  • 原文地址:https://www.cnblogs.com/CQzhangyu/p/7078857.html
Copyright © 2011-2022 走看看