bzoj 1513: [POI2006]Tet-Tetris 3D 二维线段树

88人阅读 评论(1) 收藏 举报
分类:

题目链接


【想说的话】

...........感冒了好难受


【题解】

二维线段树+标记永久化


【代码】

#include<bits/stdc++.h>

#define MAXN 3030
#define ls x<<1,lx,mid
#define rs x<<1|1,mid+1,rx

using namespace std;

inline int rd(){
	int x=0,y=1;char c=getchar();
	while(c<'0' || c>'9'){if(c=='-')y=-y;c=getchar();}
	while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
	return x*y;
}

int n,m,q;
int ll,rr;

struct treex{
	int Max[MAXN],lazy[MAXN];
	void update(int x,int lx,int rx,int l,int r,int k){
		Max[x]=max(Max[x],k);
		if(lx>=l && rx<=r)lazy[x]=max(lazy[x],k);
		else{
			int mid=(lx+rx)/2;
			if(r<=mid)update(ls,l,r,k);
			else if(l>mid)update(rs,l,r,k);
			else update(ls,l,mid,k),update(rs,mid+1,r,k);
		}
	}
	int query(int x,int lx,int rx,int l,int r){
		if(lx>=l && rx<=r)return Max[x];
		int mid=(lx+rx)/2,ans=lazy[x];
		if(r<=mid)ans=max(ans,query(ls,l,r));
		else if(l>mid)ans=max(ans,query(rs,l,r));
		else ans=max(ans,max(query(ls,l,mid),query(rs,mid+1,r)));
		return ans;
	}
};

struct treey{
	treex Max[MAXN],lazy[MAXN];
	void update(int x,int lx,int rx,int l,int r,int k){
		Max[x].update(1,1,n,ll,rr,k);
		if(lx>=l && rx<=r)lazy[x].update(1,1,n,ll,rr,k);
		else{
			int mid=(lx+rx)/2;
			if(r<=mid)update(ls,l,r,k);
			else if(l>mid)update(rs,l,r,k);
			else update(ls,l,mid,k),update(rs,mid+1,r,k);
		}
	}
	int query(int x,int lx,int rx,int l,int r){
		if(lx>=l && rx<=r)return Max[x].query(1,1,n,ll,rr);
		int mid=(lx+rx)/2,ans=lazy[x].query(1,1,n,ll,rr);
		if(r<=mid)ans=max(ans,query(ls,l,r));
		else if(l>mid)ans=max(ans,query(rs,l,r));
		else ans=max(ans,max(query(ls,l,mid),query(rs,mid+1,r)));
		return ans;
	}
}tree;

int main(){
	n=rd(),m=rd(),q=rd();
	while(q--){
		int d=rd(),s=rd(),w=rd(),x=rd(),y=rd();
		ll=x+1,rr=x+d;
		int h=tree.query(1,1,m,y+1,y+s)+w;
		tree.update(1,1,m,y+1,y+s,h);
	}
	ll=1,rr=n;
	printf("%d\n",tree.query(1,1,m,1,m));
	
	return 0;
}


查看评论

bzoj 1513: [POI2006]Tet-Tetris 3D(二维线段树+标记永久化)

1513: [POI2006]Tet-Tetris 3D Time Limit: 30 Sec  Memory Limit: 162 MB Submit: 845  Solved: 289 [S...
  • clover_hxy
  • clover_hxy
  • 2016-06-18 17:23:26
  • 629

bzoj1513【POI2006】Tet-Tetris 3D

二维线段树+标记永久化
  • AaronGZK
  • AaronGZK
  • 2016-01-18 18:18:14
  • 1480

BZOJ1513: [POI2006]Tet-Tetris 3D

题目大意:在一个给定的矩形区域内,每次查询一个矩形的最大值,然后再把这个矩形内的值全都赋成这个值加上一个数,问最后的最大值是多少 学了二维线段树,以前以为二维线段树只是树套树,后来发现二维线...
  • commonc
  • commonc
  • 2016-08-12 09:48:29
  • 643

BZOJ 1513 POI 2006 Tet-Tetris 3D 二维线段树

题目大意:三维俄罗斯方块,问最后摞了多高。 思路:二维线段树的裸题。但是要注意二维线段树不支持标记下穿。所以就不下传,每次更新答案的时候先看标记,然后用所有的跟标记比较大小之后返回。 具体...
  • jiangyuze831
  • jiangyuze831
  • 2015-02-27 08:55:39
  • 888

BZOJ 1513 POI2006 Tet-Tetris 3D 二维线段树

题目大意:给定一个矩阵,初始每个位置上的元素都是0,每次选择一个子矩形,将这个子矩形内的值修改为这个子矩形内的最大值+hh,求最终所有位置上的最大值我们需要维护一种数据结构,支持更新子矩形的值和查询子...
  • PoPoQQQ
  • PoPoQQQ
  • 2015-06-28 20:46:59
  • 1983

二维线段树 洛谷P3437 [POI2006]TET-Tetris 3D

https://www.luogu.org/problem/show?pid=3437 代码就不用看了,全抄hawer的,但是我调了一个多钟头汗; 这个就是基本的二维线段树了,lazy都不用的,不...
  • largecub233
  • largecub233
  • 2017-02-17 08:26:21
  • 299

BZOJ1513 [POI2006]Tet-Tetris 3D 二维线段树

需要区间修改的二维线段树。 使用标记永久化。 我代码是抄的,跟网上别人代码一样。 #include #include #include #include using namespace st...
  • KuribohG
  • KuribohG
  • 2015-01-07 17:30:03
  • 940

bzoj 1513 [POI2006]Tet-Tetris 3D二维线段树

一句话题意:给你一个矩形,给出两种操作,一种询问区间最大值,一种区间加。 由于刚学习二维树状数组,所以想试试,但是想了想发现没法维护最大值,或者说强行维护的话好像会到达log^4。。。因为一维树状数...
  • qq_35866453
  • qq_35866453
  • 2017-08-16 22:01:58
  • 87

[二维线段树] BZOJ 1513 [POI2006]Tet-Tetris 3D

二维线段树 算个模板题吧 区间赋值 区间max 一遇到带标记的树套树就蛋疼 怎么说呢 标记永久化 就不用下传了  从根到某个节点的区间上的路径自顶向下顺着递归的顺序修改 就省去了pushup ...
  • u014609452
  • u014609452
  • 2016-05-16 21:33:19
  • 280

BZOJ1513: [POI2006]Tet-Tetris 3D 二维线段树

题意:有一个坐标系,每次将一个矩形内所有点的值改为这个矩形内最大值+一个数,求最后所有点的最大值 N...
  • Mima_Reincarnation
  • Mima_Reincarnation
  • 2017-04-27 20:14:22
  • 365
    个人资料
    持之以恒
    等级:
    访问量: 5万+
    积分: 1825
    排名: 2万+
    最新评论