1513: [POI2006]Tet-Tetris 3D

Time Limit: 30 Sec  Memory Limit: 162 MB

Submit: 733  Solved: 245

[Submit][Status][Discuss]

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

题目大意:给定一个二维矩阵。每次询问一个矩形范围内最大值max。并把矩形内全部数更新为max+p。

看到这道题非常easy想到二维线段树,可是存在两个问题:二维线段树的标记下传和信息上传不easy实现。

那怎么解决呢?答案是用标记永久化。

我们用v和tag表示由子节点求出的最大值和全然覆盖该区间的最大值。每次改动时把路径上全部的v和底端的tag都改动,每次询问将路径上的全部tag和底端的v取最大值。

#include<set>
#include<map>
#include<ctime>
#include<queue>
#include<cmath>
#include<cstdio>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define ll long long
#define inf 1000000000
using namespace std;
ll read()
{
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int D,S,N;
int ql,qr,qd,qu;
struct segx
{
int v[3005],tag[3005];
void change(int k,int l,int r,int x,int y,int val)
{
v[k]=max(v[k],val);
if(l==x&&y==r){tag[k]=max(tag[k],val);return;}
int mid=(l+r)>>1;
if(x<=mid)change(k<<1,l,mid,x,min(mid,y),val);
if(y>mid)change(k<<1|1,mid+1,r,max(x,mid+1),y,val);
}
int query(int k,int l,int r,int x,int y)
{
if(l==x&&y==r)return v[k];
int mid=(l+r)>>1,ans=tag[k];
if(x<=mid)ans=max(ans,query(k<<1,l,mid,x,min(mid,y)));
if(y>mid)ans=max(ans,query(k<<1|1,mid+1,r,max(x,mid+1),y));
return ans;
}
};
struct segy
{
segx v[3005],tag[3005];
void change(int k,int l,int r,int x,int y,int val)
{
v[k].change(1,1,S,qd,qu,val);
if(l==x&&y==r){tag[k].change(1,1,S,qd,qu,val);return;}
int mid=(l+r)>>1;
if(x<=mid)change(k<<1,l,mid,x,min(mid,y),val);
if(y>mid)change(k<<1|1,mid+1,r,max(x,mid+1),y,val);
}
int query(int k,int l,int r,int x,int y)
{
if(l==x&&r==y)return v[k].query(1,1,S,qd,qu);
int mid=(l+r)>>1,ans=tag[k].query(1,1,S,qd,qu);
if(x<=mid)ans=max(ans,query(k<<1,l,mid,x,min(mid,y)));
if(y>mid)ans=max(ans,query(k<<1|1,mid+1,r,max(x,mid+1),y));
return ans;
}
}T;
int main()
{
D=read();S=read();N=read();
int d,s,w,x,y;
for(int i=1;i<=N;i++)
{
d=read();s=read();w=read();x=read();y=read();
ql=x+1;qr=x+d;qd=y+1;qu=y+s;
int ans=T.query(1,1,D,ql,qr);
T.change(1,1,D,ql,qr,ans+w);
}
qd=1;qu=S;
printf("%d\n",T.query(1,1,D,1,D));
return 0;
}

bzoj1513【POI2006】Tet-Tetris 3D的更多相关文章

  1. 【转】PCB中3D相关功能详解

    如果PCB Layout工程师能够在设计过程中,使用设计工具直观地看到自己设计板子的实际情况,将能够有效的帮助他们的工作.尤其现在PCB板的设计越来越复杂,密度越来越高,如果能够洞察多层板内部则可以帮 ...

  2. 【转】Altium Designer 3D封装下载及导入教程

    首先 先晒几个图:是不是很逼真啊.. ---------------------------------------教程---------------------------------------- ...

  3. 【原】CSS3的3D动画 ——3D旋转之骰子样式的钟表(2)下.md

    之前看到智能社主页的那个骰子样式的钟表,最近研究了一下,虽然没有仔细看他是怎么做的,但是学了css3的动画之后想自己尝试着写一下,用到的原理可能和智能社网站的不太一样,我自己主要用到了css3和js. ...

  4. 【学】CSS3的3D动画 ——3D旋转之骰子样式的钟表(2)上

    这个是3D旋转的进阶版,是一个类似与骰子的正方体.这个版本只有秒数的个位数,还没有写整个钟表,下面那个版本好好想想该怎么写 这个效果需要用到transform-style: preserve-3d. ...

  5. 【巩固】CSS3的3D动画 ——3D旋转(1)

    最近学了妙味的css3的动画,2D,3D的都有,先写一个最简单的3d翻转效果,鼠标移入div,正反面翻转效果. 注意点有: 要给正反面外面加个父级: transform-style: preserve ...

  6. 【BZOJ】【1520】【POI2006】Szk-Schools

    网络流/费用流 比较裸的一道题 依旧是二分图模型,由源点S连向每个学校 i (1,0),「注意是连向第 i 所学校,不是连向学校的标号m[i]……唉这里WA了一次」 然后对于每所学校 i 连接 j+n ...

  7. 【转载】HRTF音频3D定位技术综述

    1. 序 您一定有过这样的经验:在一个炎热的夏夜,讨厌的蚊子在你的耳边飞舞.此时,没有比除掉这个祸害更急所的了,对吧?做到这一点,不必睁大了眼去找蚊子,只需依靠敏锐的听力,一样可以确定蚊子的方位,在漆 ...

  8. 【Unity】5.1 3D坐标系基础知识

    分类:Unity.C#.VS2015 创建日期:2016-04-20 一.简介 在虚拟的游戏世界中,与3D有关的数学知识决定了游戏引擎如何计算和模拟出开发者以及玩家看到的每一帧画面.学习或者回想一下基 ...

  9. 【转】 Camera模仿3D效果的小例子(图片无限旋转)

    import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactor ...

随机推荐

  1. struts2 中文乱码问题,自定义过滤器通用解决方法

    问题描述 在JSP中使用form表单向后台action中传递中文参数,后台action接收到参数出现中文乱码.JSP页面统一采用了utf-8编码格式.由于struts2默认采用的编码为utf-8,根据 ...

  2. EF动态拼接查询

    1.业务中遇到个问题,需要查询如某表的id为1或者2或者3,这里是根据传递参数获取如:传递1,2或者1,3或者1,2,3这里在sql中很好拼接如下: or id= or name=3//3代表另一个字 ...

  3. 一起写框架-Ioc内核容器的实现-基础功能-ComponentScan支持多包扫描(六)

    实现功能 1.我们看到@ComponentScan注解一个开始定义就是需要支持,扫描多个包,将多个包的类名获取到.现在就实现这个功能. 实现思路 根据传入的字符串数组,获得多个包下的类全限制名. 实现 ...

  4. Thrift全面介绍

    官网:http://thrift.apache.org   简介 Thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java ...

  5. [转载] 基于Dubbo的Hessian协议实现远程调用

    转载自http://shiyanjun.cn/archives/349.html Dubbo基于Hessian实现了自己Hessian协议,可以直接通过配置的Dubbo内置的其他协议,在服务消费方进行 ...

  6. Redis 持久化之RDB和AOP

    Redis 持久化之RDB和AOP Redis 有两种持久化方案,RDB (Redis DataBase)和 AOP (Append Only File).如果你先快速了解和使用RDB和AOP,可以直 ...

  7. anaconda安装第三方库

    用anaconda的pip安装第三方python包 启动anaconda命令窗口: 开始> 所有程序> anaconda> anaconda prompt pip install 第 ...

  8. 使用JSCH框架通过跳转机访问其他节点

    之前搞了套远程访问ssh进行操作的代码,最近有需求,需要通过一台跳转机才能访问目标服务.在网上搜了半天,也没找到比较好的例子,就自己翻阅了下JSCH的API.但是看的云里雾里的.联想了下,端口转发的原 ...

  9. Laravel 5 框架性能优化技巧

    性能一直是 Laravel 框架为人诟病的一个点,所以调优 Laravel 程序算是一个必学的技能. 接下来分享一些开发的最佳实践,还有调优技巧,大家有别的建议也欢迎留言讨论 1.配置缓存信息 使用l ...

  10. vue搭建环境

    大早起的,没想自己起来那么早,既然起来了,就写点东西吧~最近在看Vue的东西,发现网上也是好多的资源,包括博客和视频 , 我是看的慕课网上的vue ,名字忘记了,价格148的,看了,也整理了笔记,看了 ...