【POI2006】【BZOJ1513】Tet-Tetris 3D
来源:互联网 发布:淘宝批量上传淘宝联盟 编辑:程序博客网 时间:2024/06/05 23:47
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
HINT
Source
这好像是我写的第一个二维线段树的题
二维线段树+标记永久化
#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#define MAXN 1010#define ln rt<<1#define rn rt<<1|1#define GET (ch>='0'&&ch<='9')using namespace std;int D,S,N;int ql,qr,qd,qu;void in(int &x){ char ch=getchar();x=0; while (!GET) ch=getchar(); while (GET) x=x*10+ch-'0',ch=getchar();}struct seg{ int maxn[MAXN*3],flag[MAXN*3]; void modify(int rt,int L,int R,int l,int r,int delta) { maxn[rt]=max(maxn[rt],delta);int mid=(L+R)>>1; if (l==L&&r==R) {flag[rt]=max(flag[rt],delta);return;} if (l>mid) modify(rn,mid+1,R,l,r,delta); else if (r<=mid) modify(ln,L,mid,l,r,delta); else modify(ln,L,mid,l,mid,delta),modify(rn,mid+1,R,mid+1,r,delta); } int query(int rt,int L,int R,int l,int r) { if (l==L&&r==R) return maxn[rt]; int mid=(L+R)>>1,ret=flag[rt]; if (l>mid) ret=max(ret,query(rn,mid+1,R,l,r)); else if (r<=mid) ret=max(ret,query(ln,L,mid,l,r)); else ret=max(ret,max(query(ln,L,mid,l,mid),query(rn,mid+1,R,mid+1,r))); return ret; }};struct Seg{ seg tree[MAXN*3],flag[MAXN*3]; void modify(int rt,int L,int R,int l,int r,int delta) { tree[rt].modify(1,1,S,qd,qu,delta);int mid=(L+R)>>1; if (l==L&&r==R) {flag[rt].modify(1,1,S,qd,qu,delta);return;} if (l>mid) modify(rn,mid+1,R,l,r,delta); else if (r<=mid) modify(ln,L,mid,l,r,delta); else modify(ln,L,mid,l,mid,delta),modify(rn,mid+1,R,mid+1,r,delta); } int query(int rt,int L,int R,int l,int r) { if (L==l&&r==R) return tree[rt].query(1,1,S,qd,qu); int mid=(L+R)>>1,ret=flag[rt].query(1,1,S,qd,qu); if (l>mid) ret=max(ret,query(rn,mid+1,R,l,r)); else if (r<=mid) ret=max(ret,query(ln,L,mid,l,r)); else ret=max(ret,max(query(ln,L,mid,l,mid),query(rn,mid+1,R,mid+1,r))); return ret; }}Tree;int main(){ in(D);in(S);in(N);int d,s,w,x,y; while (N--) { in(d);in(s);in(w);in(x);in(y);ql=x+1;qr=x+d;qd=y+1;qu=y+s; int ans=Tree.query(1,1,D,ql,qr); Tree.modify(1,1,D,ql,qr,ans+w); } ql=1;qr=D;qd=1;qu=S; printf("%d\n",Tree.query(1,1,D,1,D));}
1 0
- bzoj1513【POI2006】Tet-Tetris 3D
- 【POI2006】【BZOJ1513】Tet-Tetris 3D
- POI2006-BZOJ1513:Tet-Tetris 3D
- BZOJ1513: [POI2006]Tet-Tetris 3D
- 【bzoj1513】[POI2006]Tet-Tetris 3D
- BZOJ1513 [POI2006]Tet-Tetris 3D 二维线段树
- BZOJ1513: [POI2006]Tet-Tetris 3D 二维线段树
- 【BZOJ1513】【POI2006】Tet-Tetris 3D 二维线段树+标记永久化
- bzoj1513 Tet-Tetris 3D(二维线段树)
- BZOJ 1513 POI2006 Tet-Tetris 3D 二维线段树
- BZOJ 1513 [POI2006]Tet-Tetris 3D 二维线段树
- [二维线段树] BZOJ 1513 [POI2006]Tet-Tetris 3D
- 二维线段树 洛谷P3437 [POI2006]TET-Tetris 3D
- BZOJ 1513: [POI2006]Tet-Tetris 3D 二维线段树
- bzoj 1513 [POI2006]Tet-Tetris 3D二维线段树
- 【BZOJ】1513 [POI2006]Tet-Tetris 3D 树套树
- bzoj 1513: [POI2006]Tet-Tetris 3D 二维线段树
- bzoj 1513: [POI2006]Tet-Tetris 3D(二维线段树+标记永久化)
- Uva 202
- 在CentOS7.0安装php5.6
- 关于内存的段式管理
- CocoaPods使用
- 简易计算器
- 【POI2006】【BZOJ1513】Tet-Tetris 3D
- 进制转换 4
- Uva10340
- hdu1019——Least Common Multiple
- java 站内搜索lucene 分词工具 IKAnalyzer,更新字典需要重启服务的解决
- Git创建远程库错误Not a git repository (or any of the parent directories): .git
- 线性表
- Swift类与结构、存储属性、计算属性、函数与方法、附属脚本等
- Codeforces Round #341 (Div. 2)总结