bzoj 1513 [POI2006]Tet-Tetris 3D(二维线段树)
2016-02-15 16:20
501 查看
1513: [POI2006]Tet-Tetris 3D
Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 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 44 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 = 3*1e3+10; int D,S,n; int ql,qr,qd,qu; struct segx{ int v ,setv ; 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)>>1; if(l<=M) change(u<<1,L,M,l,r,x); if(M<r) change(u<<1|1,M+1,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)>>1,ans=setv[u]; if(l<=M) ans=max(ans,query(u<<1,L,M,l,r)); if(M<r) ans=max(ans,query(u<<1|1,M+1,R,l,r)); return ans; } } }; struct segy{ segx v ,setv ; void change(int u,int L,int R,int l,int r,int x) { v[u].change(1,1,S,qd,qu,x); if(l<=L && R<=r) setv[u].change(1,1,S,qd,qu,x); else { int M=(L+R)>>1; if(l<=M) change(u<<1,L,M,l,r,x); if(M<r) change(u<<1|1,M+1,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(1,1,S,qd,qu); else { int M=(L+R)>>1,ans=setv[u].query(1,1,S,qd,qu); if(l<=M) ans=max(ans,query(u<<1,L,M,l,r)); if(M<r) ans=max(ans,query(u<<1|1,M+1,R,l,r)); return ans; } } }T; int main() { scanf("%d%d%d",&D,&S,&n); int d,s,w,x,y; for(int i=0;i<n;i++) { scanf("%d%d%d%d%d",&d,&s,&w,&x,&y); ql=x+1,qr=x+d,qd=y+1,qu=y+s; int h=T.query(1,1,D,ql,qr); T.change(1,1,D,ql,qr,h+w); } qd=1,qu=S,ql=1,qr=D; printf("%d",T.query(1,1,D,ql,qr)); return 0; }
相关文章推荐
- javascript 定义正则表达式
- 第44讲:Scala中View Bounds代码实战及其在Spark中的应用源码解析
- shell脚本编程总结
- 关于oracle存储过程和触发器
- UVa--400 Unix ls(格式输出)
- PHP数组操作
- 使用Bundle.putSerializable() 在Activity中交换数据
- python中的引用
- IOS 开发 证书显示 此证书签发者无效 解决办法
- 整理JAVA面试题
- 机房重构——职责链模式搞定计算下机时间问
- SpringMvc:在使用@RequestBody和@ResponseBody的时候报415错误
- Android shell 脚本
- jvm之类加载器(2)
- Win10系统如何创建拨号连接?Win10创建拨号连接的方法
- php获取某天的上周一日期与时间戳
- 求逆元的方法汇总
- 页面繁体简体互换
- 各脑叶功能及联合皮质区
- TCP/IP协议之TCP