bzoj 1513 [POI2006]Tet-Tetris 3D(二维线段树)
1513: [POI2006]Tet-Tetris 3D
Time Limit: 30 Sec Memory Limit: 162 MB
Submit: 540 Solved: 175
[Submit][Status]
Description
"Tetris" 游戏的作者决定做一个新的游戏, 一个三维的版本, 在里面很多立方体落在平面板,一个立方体开始落下直到碰上一个以前落下的立方体或者落地即停止.
作者想改变一下游戏的目的使得它更大众化,在新游戏中你将知道落下的立方体信息以及位置,你的任务就是回答所有立方体落下后最高的方块的高度.所有的立方体在下落过程中都是垂直的并且不会旋转.平板左下角坐标为原点,并且平行于坐标轴.
Input
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
4 3 2 0 0
3 3 1 3 0
7 1 2 0 3
2 3 3 2 2
Sample Output
6
【思路】
线段树套线段树
第二维的每一维都是一棵线段树,两者操作相似。
【代码】
#include<cstdio>
#include<algorithm>
using namespace std; const int N = *1e3+; int D,S,n;
int ql,qr,qd,qu; struct segx{
int v[N],setv[N];
void change(int u,int L,int R,int l,int r,int x) {
v[u]=max(v[u],x);
if(l<=L && R<=r) setv[u]=x;
else {
int M=(L+R)>>;
if(l<=M) change(u<<,L,M,l,r,x);
if(M<r) change(u<<|,M+,R,l,r,x);
}
}
int query(int u,int L,int R,int l,int r) {
if(l<=L && R<=r) return v[u];
else {
int M=(L+R)>>,ans=setv[u];
if(l<=M) ans=max(ans,query(u<<,L,M,l,r));
if(M<r) ans=max(ans,query(u<<|,M+,R,l,r));
return ans;
}
}
};
struct segy{
segx v[N],setv[N];
void change(int u,int L,int R,int l,int r,int x) {
v[u].change(,,S,qd,qu,x);
if(l<=L && R<=r) setv[u].change(,,S,qd,qu,x);
else {
int M=(L+R)>>;
if(l<=M) change(u<<,L,M,l,r,x);
if(M<r) change(u<<|,M+,R,l,r,x);
}
}
int query(int u,int L,int R,int l,int r) {
if(l<=L && R<=r) return v[u].query(,,S,qd,qu);
else {
int M=(L+R)>>,ans=setv[u].query(,,S,qd,qu);
if(l<=M) ans=max(ans,query(u<<,L,M,l,r));
if(M<r) ans=max(ans,query(u<<|,M+,R,l,r));
return ans;
}
}
}T; int main() {
scanf("%d%d%d",&D,&S,&n);
int d,s,w,x,y;
for(int i=;i<n;i++) {
scanf("%d%d%d%d%d",&d,&s,&w,&x,&y);
ql=x+,qr=x+d,qd=y+,qu=y+s;
int h=T.query(,,D,ql,qr);
T.change(,,D,ql,qr,h+w);
}
qd=,qu=S,ql=,qr=D;
printf("%d",T.query(,,D,ql,qr));
return ;
}
bzoj 1513 [POI2006]Tet-Tetris 3D(二维线段树)的更多相关文章
- bzoj 1513 POI2006 Tet-Tetris 3D 二维线段树+标记永久化
1511: [POI2006]OKR-Periods of Words Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 351 Solved: 220[S ...
- 【BZOJ1513】[POI2006]Tet-Tetris 3D 二维线段树
[BZOJ1513][POI2006]Tet-Tetris 3D Description Task: Tetris 3D "Tetris" 游戏的作者决定做一个新的游戏, 一个三维 ...
- 洛谷.3437.[POI2006]TET-Tetris 3D(二维线段树)
题目链接 下落一个d*s的方块,则要在这个平面区域找一个最高的h' 更新整个平面区域的值为h+h' 对于本题,维护最大高度h和all 对于平面的x轴维护一棵线段树t1,每个t1的节点维护对应y轴的两棵 ...
- 洛谷P3437 [POI2006]TET-Tetris 3D(二维线段树 标记永久化)
题意 题目链接 Sol 二维线段树空间复杂度是多少啊qwqqq 为啥这题全网空间都是\(n^2\)还有人硬要说是\(nlog^2n\)呀.. 对于这题来说,因为有修改操作,我们需要在外层线段树上也打标 ...
- BZOJ 4785 [Zjoi2017]树状数组 | 二维线段树
题目链接 BZOJ 4785 题解 这道题真是令人头秃 = = 可以看出题面中的九条可怜把求前缀和写成了求后缀和,然后他求的区间和却仍然是sum[r] ^ sum[l - 1],实际上求的是闭区间[l ...
- BZOJ.4553.[HEOI2016&TJOI2016]序列(DP 树状数组套线段树/二维线段树(MLE) 动态开点)
题目链接:BZOJ 洛谷 \(O(n^2)\)DP很好写,对于当前的i从之前满足条件的j中选一个最大值,\(dp[i]=d[j]+1\) for(int j=1; j<i; ++j) if(a[ ...
- BZOJ 3489 A simple rmq problem 可持久化KDtree/二维线段树
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3489 题意概述: 给出一个序列,每次询问一个序列区间中仅出现了一次的数字最大是多少,如果 ...
- [BZOJ4785][ZJOI2017]树状数组(概率+二维线段树)
4785: [Zjoi2017]树状数组 Time Limit: 40 Sec Memory Limit: 512 MBSubmit: 297 Solved: 195[Submit][Status ...
- UVA 11297 线段树套线段树(二维线段树)
题目大意: 就是在二维的空间内进行单个的修改,或者进行整块矩形区域的最大最小值查询 二维线段树树,要注意的是第一维上不是叶子形成的第二维线段树和叶子形成的第二维线段树要 不同的处理方式,非叶子形成的 ...
- POJ2155 Matrix二维线段树经典题
题目链接 二维树状数组 #include<iostream> #include<math.h> #include<algorithm> #include<st ...
随机推荐
- sublime2 Ctags 快捷键
Commands Listing Command Key Binding Alt Binding Mouse Binding rebuild_ctags ctrl+t, ctrl+r navi ...
- 《tr命令-优化版》-linux命令五分钟系列之二十五
本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket. 为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. ...
- Linux内核设计与实现 读书笔记
第三章 进程管理 1. fork系统调用从内核返回两次: 一次返回到子进程,一次返回到父进程 2. task_struct结构是用slab分配器分配的,2.6以前的是放在内核栈的栈底的:所有进程的ta ...
- jQuery--Dom元素隐藏和显示原理(源码2.0.3)
对于Dom元素显示和隐藏的操作,jQuery提供了比较方便的函数,我们也经常使用: 1. show() : 显示Dom元素2. hide() : 隐藏Dom元素3. toggle() : 改变Dom元 ...
- 使用Map辅助拼装树状结构,消除递归调用
目前菜单或其他树状结构在数据库中的存储,多数是以一个parentid作为关联字段,以一维形式存储.使用时全部查询出来,然后在内存中拼装成树状结构.现在主要涉及的是拼装方法的问题. 一般可以进行 递归调 ...
- DelphiXE4- System.IOUtils.TDirectory笔记查询后缀名为dll的文件
TStringDynArray 在System.Types中定义
- Soy文件生成JS文件 - 一个使用Google soy模板的例子
1.下载工具包,后解压. http://closure-templates.googlecode.com/files/closure-templates-for-javascript-latest.z ...
- QQ空间的“神奇”图片
近几天好多朋友问我qq空间出现的神奇图片原理,最近比较烦,事情比较多,一直没理.加上我对PHP之类的语言也一知半解. 今天闲了看了一下QQ空间,发现这个很早以前就有人写过这样的帖子了 看别人解释 (转 ...
- Cocoapod安装 - 管理第三方库
在我们开发移动应用的时候,一般都会使用到第三方工具,而由于第三方类库的种类繁多,我们在项目中进行管理也会相对麻烦,所以此时我们就需要一个包管理工具,在iOS开发中,我们使用最多的就是Cocoapods ...
- Creating Shazam in Java
A couple of days ago I encountered this article: How Shazam Works This got me interested in how a pr ...