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. 基于Django的python验证码

    验证码 在用户注册.登录页面,为了防止暴力请求,可以加入验证码功能,如果验证码错误,则不需要继续处理,可以减轻一些服务器的压力 使用验证码也是一种有效的防止crsf的方法 验证码效果如下图: 验证码视 ...

  2. flask中使用xlsxwriter导出excel文件

    最近需要使用flask导出xlsxwriter生成的excel文件,在文件比较小的情况下,可以直接导出. 首先,这里使用了StringIO,导出使用的模块 import xlsxwriter impo ...

  3. Java设计模式相关面试

    1.接口是什么?为什么要使用接口而不是直接使用具体类? 接口用于定义 API.它定义了类必须得遵循的规则.同时,它提供了一种抽象,因为客户端只使用接口,这样可以有多重实现,如 List 接口,你可以使 ...

  4. c#简单实现二维数组和二维数组列表List&lt;&gt;的转置

    刚看到网上一篇文章里用sql实现了行列转置.sql server 2005/2008只用一个pivot函数就可以实现sql server 2000很多行的复杂实现.提到转置,立刻想起还在求学阶段曾经做 ...

  5. [转载] ZooKeeper原理及使用

    转载自http://www.wuzesheng.com/?p=2609 ZooKeeper是Hadoop Ecosystem中非常重要的组件,它的主要功能是为分布式系统提供一致性协调(Coordina ...

  6. mysql数据库第一弹

    mysql(一) sql语句 sql是Structured Query Language(结构化查询语言)的缩写.SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言. 在使用它时,只需要 ...

  7. python进阶------进程线程(四)

    Python中的协程 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其 ...

  8. "MySql.Data.MySqIClient.MySqlProviderSevices”违反了继承安全 性规则。派生类型必须与基类型的安全可访问性匹配或者比基类型的安 全可访问性低。 "解决方法

    写Code First 时(使用的是MySql数据库),添加好EntityFrame.MySql.Data .MySql.Data.Entity后 ,写好TestDbContext类. 运行时报出一个 ...

  9. 【续】抓个Firefox的小辫子,jQuery表示不背这黑锅,Chrome,Edge,IE8-11继续围观中

    引子 昨天我发了一篇文章[抓个Firefox的小辫子,围观群众有:Chrome.Edge.IE8-11],提到了一个Firefox很多版本都存在的问题,而相同的测试页面在Chrome.Edge.IE8 ...

  10. 理解defineProperty以及getter、setter

    我们常听说vue是用getter与setter实现数据监控的,那么getter与setter到底是什么东西,它与defineProperty是什么关系,平时有哪些用处呢?本文将为大家一一道来. 对象的 ...