bzoj1513【POI2006】Tet-Tetris 3D

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。

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

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

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

#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;
}
时间: 2024-10-28 19:15:32

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

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

首先 先晒几个图:是不是很逼真啊.. ---------------------------------------教程-------------------------------------------------------------------------------------------------------------------------- 我们常用的3D封装可以在这个网站下载.http://www.3dcontentcentral.cn/Search.aspx?arg=0

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

如果PCB Layout工程师能够在设计过程中,使用设计工具直观地看到自己设计板子的实际情况,将能够有效的帮助他们的工作.尤其现在PCB板的设计越来越复杂,密度越来越高,如果能够洞察多层板内部则可以帮助工程师避免很多不易察觉的错误.特别对于电子产品的机电一体化设计,Altium Designer对于STEP格式的3D模型的支持及导入导出,极大地方便了ECAD-MCAD之间的无缝协作. Altium Designer 凭借其突出的 3D 设计能力,提供当今公认一流的三维 PCB 设计平台.PCB

【BZOJ1513】【POI2006】Tet-Tetris 3D 二维线段树+标记永久化

题解:题意很裸啊~~~ 培训的时候说要写标记永久化,反正永久化很水,就直接写了. 但是我并不知道为什么要永久化,或者说理解不深刻,但是再遇上肯定能分析出来233. 大概应该可能或许就是: 直接原因:下传标记传不下去. 根本原因: 线段树有两层,这样它的传递可能就有点像拓扑了 就是外层线段树需要往内层线段树传,然后内层线段树还要下传 这样扫到某处时发现,****,还需要顺着两边的标记路径回溯到根, 然后各种压栈啊什么的,才能传下去,而且大概率出错(代码错或思路错). 所以简简单单写个标记永久化好了

【转】使用Ogre 3D 运动模型 -----OGRE 3D 1.7 Beginner‘s Guide中文版 第五章

原文地址: http://www.cnblogs.com/oneDouble/archive/2012/07/11/2587193.html 原文: 代友转载,原译者:[email protected] 博客 www.singmelody.com 这章的重点会在模型动作和它们通常是怎样工作上,特别是在Ogre 3D 方面.没有运动,那么一个3D场景是没有生机的.运动是使场景现实和有趣的最重要的因素之一. 在这一章,我们将会: ※ 播放一个运动. ※把两个运动结合起来. ※在运动上关联实体. 一.

【学】CSS3的3D动画 ——3D旋转(1)—— 妙味课堂

最近学了妙味的css3的动画,2D,3D的都有,先写一个最简单的3d翻转效果,鼠标移入div,正反面翻转效果. 注意点有: 要给正反面外面加个父级: transform-style: preserve-3d;是加在正反面的父级,使动画具有3d的效果:但是ie11并不支持preserve-3d perspective也要加在父级上,使动画具有透视效果: 要给父级也加上宽高,否则动画没有效果 <style> #box{ margin: 70px auto; width: 300px; height

【学】CSS3的3D动画 ——3D旋转之骰子样式的钟表(2)上—— 妙味课堂

这个是3D旋转的进阶版,是一个类似与骰子的正方体.这个版本只有秒数的个位数,还没有写整个钟表,下面那个版本好好想想该怎么写 这个效果需要用到transform-style: preserve-3d. 利用transform: rotateX, rotateY, rotateZ来定义物体转动轴,实现3D旋转 给一个正方体设置6个面,每个面都设置旋转基面,并且直接先朝各个方向转90度,有一个面要注意,就是和最前面的那个面的对面,不用转,但是要用transform: translateZ()来让这个面

【原】CSS3的3D动画 ——3D旋转之骰子样式的钟表(2)下 - 模仿智能社网页下的.md

之前看到智能社主页的那个骰子样式的钟表,最近研究了一下,虽然没有仔细看他是怎么做的,但是学了css3的动画之后想自己尝试着写一下,用到的原理可能和智能社网站的不太一样,我自己主要用到了css3和js. 程序写到一半,发现只有chrome和ff支持,而用ie11是没有效果的,然后用ie11去打开智能社网页,效果也是没有,调查了一下,应该是transform-style:preserve-3d这个样式在ie11下还不支持,使得对象无法以3d的样式呈现,至于兼容方式,自己还没有花时间研究,所以这个效果

bzoj1524【POI2006】Pal

1524: [POI2006]Pal Time Limit: 5 Sec  Memory Limit: 357 MB Submit: 367  Solved: 121 [Submit][Status][Discuss] Description 给出n个回文串s1, s2, -, sn 求如下二元组(i, j)的个数 si + sj 仍然是回文串 规模 输入串总长不超过2M bytes Input The first line of input file contains the number o

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

分类:Unity.C#.VS2015 创建日期:2016-04-20 一.简介 在虚拟的游戏世界中,与3D有关的数学知识决定了游戏引擎如何计算和模拟出开发者以及玩家看到的每一帧画面.学习或者回想一下基础的3D有关的数学知识,可以帮助开发者对游戏引擎产生更深刻的了解. 二.坐标系 在游戏开发中,经常会用到不同的坐标系来描述空间中的位置,常用的坐标系有: 1.世界坐标系(World) 用于描述游戏场景内所有物体位置和方向的基准,也称为全局坐标系. 2.局部坐标系(Local) 每个物体都有其独立的物