1513: [POI2006]Tet-Tetris 3D

Time Limit: 30 Sec  Memory Limit: 162 MB
Submit: 540  Solved: 175
[Submit][Status]

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

【思路】

线段树套线段树

第二维的每一维都是一棵线段树,两者操作相似。

【代码】

 #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(二维线段树)的更多相关文章

  1. bzoj 1513 POI2006 Tet-Tetris 3D 二维线段树+标记永久化

    1511: [POI2006]OKR-Periods of Words Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 351  Solved: 220[S ...

  2. 【BZOJ1513】[POI2006]Tet-Tetris 3D 二维线段树

    [BZOJ1513][POI2006]Tet-Tetris 3D Description Task: Tetris 3D "Tetris" 游戏的作者决定做一个新的游戏, 一个三维 ...

  3. 洛谷.3437.[POI2006]TET-Tetris 3D(二维线段树)

    题目链接 下落一个d*s的方块,则要在这个平面区域找一个最高的h' 更新整个平面区域的值为h+h' 对于本题,维护最大高度h和all 对于平面的x轴维护一棵线段树t1,每个t1的节点维护对应y轴的两棵 ...

  4. 洛谷P3437 [POI2006]TET-Tetris 3D(二维线段树 标记永久化)

    题意 题目链接 Sol 二维线段树空间复杂度是多少啊qwqqq 为啥这题全网空间都是\(n^2\)还有人硬要说是\(nlog^2n\)呀.. 对于这题来说,因为有修改操作,我们需要在外层线段树上也打标 ...

  5. BZOJ 4785 [Zjoi2017]树状数组 | 二维线段树

    题目链接 BZOJ 4785 题解 这道题真是令人头秃 = = 可以看出题面中的九条可怜把求前缀和写成了求后缀和,然后他求的区间和却仍然是sum[r] ^ sum[l - 1],实际上求的是闭区间[l ...

  6. 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[ ...

  7. BZOJ 3489 A simple rmq problem 可持久化KDtree/二维线段树

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3489 题意概述: 给出一个序列,每次询问一个序列区间中仅出现了一次的数字最大是多少,如果 ...

  8. [BZOJ4785][ZJOI2017]树状数组(概率+二维线段树)

    4785: [Zjoi2017]树状数组 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 297  Solved: 195[Submit][Status ...

  9. UVA 11297 线段树套线段树(二维线段树)

    题目大意: 就是在二维的空间内进行单个的修改,或者进行整块矩形区域的最大最小值查询 二维线段树树,要注意的是第一维上不是叶子形成的第二维线段树和叶子形成的第二维线段树要  不同的处理方式,非叶子形成的 ...

  10. POJ2155 Matrix二维线段树经典题

    题目链接 二维树状数组 #include<iostream> #include<math.h> #include<algorithm> #include<st ...

随机推荐

  1. C++ 引用(&)

    #include <iostream> void sort(int &a, int &b){ if (a>=b) { return; } if (a<b) { ...

  2. (转)Libevent(2)— event、event_base

    转自:http://name5566.com/4198.html 参考文献列表:http://www.wangafu.net/~nickm/libevent-book/ 此文编写的时候,使用到的 Li ...

  3. [C#]『Task』任务并行库使用小计

    1.简单创建使用 using System; using System.Diagnostics; using System.Threading; using System.Threading.Task ...

  4. mongodb3.2系统性学习——2、write concern mongodb 写安全机制

    为了尊重作者原文章位置:http://kyfxbl.iteye.com/blog/1952941 首先讲一下mongodb 的写操作过程: mongodb有一个write concern的设置,作用是 ...

  5. PHP全局变量

    1.global 关键字 2.$GLOBALS 3.使用静态变量

  6. linux 中 ‘|’的作用

    利用Linux所提供的管道符“|”将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入.连续使用管道意味着第一个命令的输出会作为 第二个命令的输入,第二个命令的输出又会作为第三个命令的输入 ...

  7. 【python之旅】python的基础三

    目录: 1.装饰器 2.迭代器&生成器 3.Json & pickle 数据序列化 4.软件目录结构规范  一.装饰器 定义:本质是函数,(装饰其他函数)就是为其他函数添加附加功能 原 ...

  8. STM32下载方法

    一.JLINK下载方法 1.硬件设置 Boot0,Boot1 = 0,*(测试通过) Boot0,Boot1 = 1,0或者0,1(未测试) 2.软件设置 MDK设置 ① 选择Project -> ...

  9. MOS管体二极管的作用

    这里有两种解释: 1.mos管本身自带有寄生二极管,作用是防止VDD过压的情况下,烧坏mos管,因为在过压对MOS管造成破坏之前,二极管先反向击穿,将大电流直接到地,从而避免MOS管被烧坏. 2.防止 ...

  10. Linq语句与aspnetpager结合分页

    public void DataBindList()        {            List<EnDeContent> listCon = null;            in ...