【BZOJ1513】[POI2006]Tet-Tetris 3D

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

题解:还是给一个直来直去的题面吧:给你一个平面,每次将一个矩形中的所有数改为(矩形中的最大数+w),问n次操作后平面内最大的数是多少。

看题面就知道一定是要用二维线段树的,不过二维线段树必须标记永久化。标记永久化这个词对本蒟蒻来说倒是比较陌生,不过仔细想想以前也的确做过许多用到标记永久化的思想的题。

说白了,就是在区间更新和区间查询的时候,免去pushup和pushdown操作,而是改为:更新的时候,修改沿路的所有pushup的标记,并修改目标节点的pushdown标记;查询的时候,查询沿路的所有pushdown标记,并查询目标节点的pushup标记。

哦,对了,必须标记永久化 说的是外层线段树,内层线段树还是可以正常搞的。

此外本题略微卡空间~

#include <cstdio>
#include <cstring>
#include <iostream>
#define lson x<<1
#define rson x<<1|1
using namespace std;
const int maxn=1010;
int n,D,S;
int rup[maxn<<2],rdn[maxn<<2];
struct sag
{
int sm[maxn<<12],tag[maxn<<12],ls[maxn<<12],rs[maxn<<12],tot;
void pushdown(int x)
{
if(tag[x])
{
if(!ls[x]) ls[x]=++tot;
if(!rs[x]) rs[x]=++tot;
sm[ls[x]]=max(sm[ls[x]],tag[x]),tag[ls[x]]=max(tag[ls[x]],tag[x]);
sm[rs[x]]=max(sm[rs[x]],tag[x]),tag[rs[x]]=max(tag[rs[x]],tag[x]);
tag[x]=0;
}
}
void updata(int l,int r,int &x,int a,int b,int c)
{
if(!x) x=++tot;
if(a<=l&&r<=b)
{
sm[x]=max(sm[x],c),tag[x]=max(tag[x],c);
return ;
}
pushdown(x);
int mid=l+r>>1;
if(a<=mid) updata(l,mid,ls[x],a,b,c);
if(b>mid) updata(mid+1,r,rs[x],a,b,c);
sm[x]=max(sm[ls[x]],sm[rs[x]]);
}
int query(int l,int r,int x,int a,int b)
{
if(!x) return 0;
if(a<=l&&r<=b) return sm[x];
pushdown(x);
int mid=l+r>>1;
if(b<=mid) return query(l,mid,ls[x],a,b);
if(a>mid) return query(mid+1,r,rs[x],a,b);
return max(query(l,mid,ls[x],a,b),query(mid+1,r,rs[x],a,b));
}
}sup,sdn;
void modify(int l,int r,int x,int a,int b,int c,int d,int e)
{
sup.updata(1,S,rup[x],c,d,e);
if(a<=l&&r<=b)
{
sdn.updata(1,S,rdn[x],c,d,e);
return ;
}
int mid=l+r>>1;
if(a<=mid) modify(l,mid,lson,a,b,c,d,e);
if(b>mid) modify(mid+1,r,rson,a,b,c,d,e);
}
int ask(int l,int r,int x,int a,int b,int c,int d)
{
int mid=l+r>>1,ret=sdn.query(1,S,rdn[x],c,d);
if(a<=l&&r<=b) ret=max(ret,sup.query(1,S,rup[x],c,d));
else
{
if(a<=mid) ret=max(ret,ask(l,mid,lson,a,b,c,d));
if(b>mid) ret=max(ret,ask(mid+1,r,rson,a,b,c,d));
}
return ret;
}
int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
int main()
{
D=rd(),S=rd(),n=rd();
int i,j,a,b,c,d,e;
for(i=1;i<=n;i++)
{
c=rd(),d=rd(),e=rd(),a=rd(),b=rd();
modify(1,D,1,a+1,a+c,b+1,b+d,ask(1,D,1,a+1,a+c,b+1,b+d)+e);
}
printf("%d",ask(1,D,1,1,D,1,S));
return 0;
}

【BZOJ1513】[POI2006]Tet-Tetris 3D 二维线段树的更多相关文章

  1. bzoj 1513 POI2006 Tet-Tetris 3D 二维线段树+标记永久化

    1511: [POI2006]OKR-Periods of Words Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 351  Solved: 220[S ...

  2. 洛谷.3437.[POI2006]TET-Tetris 3D(二维线段树)

    题目链接 下落一个d*s的方块,则要在这个平面区域找一个最高的h' 更新整个平面区域的值为h+h' 对于本题,维护最大高度h和all 对于平面的x轴维护一棵线段树t1,每个t1的节点维护对应y轴的两棵 ...

  3. 洛谷P3437 [POI2006]TET-Tetris 3D(二维线段树 标记永久化)

    题意 题目链接 Sol 二维线段树空间复杂度是多少啊qwqqq 为啥这题全网空间都是\(n^2\)还有人硬要说是\(nlog^2n\)呀.. 对于这题来说,因为有修改操作,我们需要在外层线段树上也打标 ...

  4. UVA 11297 线段树套线段树(二维线段树)

    题目大意: 就是在二维的空间内进行单个的修改,或者进行整块矩形区域的最大最小值查询 二维线段树树,要注意的是第一维上不是叶子形成的第二维线段树和叶子形成的第二维线段树要  不同的处理方式,非叶子形成的 ...

  5. POJ2155 Matrix二维线段树经典题

    题目链接 二维树状数组 #include<iostream> #include<math.h> #include<algorithm> #include<st ...

  6. HDU 1823 Luck and Love(二维线段树)

    之前只知道这个东西的大概概念,没具体去写,最近呵呵,今补上. 二维线段树 -- 点更段查 #include <cstdio> #include <cstring> #inclu ...

  7. poj 2155:Matrix(二维线段树,矩阵取反,好题)

    Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 17880   Accepted: 6709 Descripti ...

  8. poj 1195:Mobile phones(二维线段树,矩阵求和)

    Mobile phones Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 14391   Accepted: 6685 De ...

  9. POJ 2155 Matrix (二维线段树)

    Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 17226   Accepted: 6461 Descripti ...

随机推荐

  1. 10 种机器学习算法的要点(附 Python)(转载)

    一.前言 谷歌董事长施密特曾说过:虽然谷歌的无人驾驶汽车和机器人受到了许多媒体关注,但是这家公司真正的未来在于机器学习,一种让计算机更聪明.更个性化的技术 也许我们生活在人类历史上最关键的时期:从使用 ...

  2. [ACM] POJ 1035 Spell checker (单词查找,删除替换添加不论什么一个字母)

    Spell checker Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 18693   Accepted: 6844 De ...

  3. 使用Ant构建简单项目

    Apache Ant主要用于Java项目的构建.为什么要使用Ant: 1)项目构建不是简单的编译,各种资源需要合理构建,例如有的类需要压缩成jar文件,有的文件需要放在指定位置,有时候需要使用配置文件 ...

  4. [PWA] Customize the Splash Screen of a PWA built with create-react-app

    Android displays a splash screen for PWAs based on the icons and names you provide, but iOS just dis ...

  5. 倍福TwinCAT(贝福Beckhoff)基础教程5.1 TwinCAT-3 读写注册表

    读写注册表和读写文件一样,里面涉及的输入类型比较复杂,需要参考官方范例 sSubKey是指注册表的路径 sValName是指注册表要写入的名值对的名称 eValType是一个枚举类型(而且不是什么常规 ...

  6. Phalcon 上下文编码(Contextual Escaping)

    站点及其他B/S应用极易受到 XSS 攻击,虽然PHP提供了转义功能.在某些情况下依旧不够安全.在Phalcon中 Phalcon\Escaper 提供了上下文转义功能,这个模块是由C语言实现的, 这 ...

  7. odoo12新特性: 会计改进

    改进分析会计 分析会计层级结构 分析分配 分析分录增加了表格视图     ============== SPECIFICATIONS ============== a. Hierarchy  - Cr ...

  8. 自制的React同构脚手架

    代码地址如下:http://www.demodashi.com/demo/12575.html Web前端世界日新月异变化太快,为了让自己跟上节奏不掉队,总结出了自己的一套React脚手架,方便日后新 ...

  9. WebService学习小结

    基于web的服务,服务器整理资源供多个客户端应用访问,是一种多个跨平台跨语言的应用间通信整合的方案 使用场景:天气预报.股票.地图,火车票 schema约束复习 <!-- book.xsd,定义 ...

  10. 【转】mongoDB命令行和客户端访问

    一.客户端 mongodb客户端常用的是mongoVUE  下载mongoVUE:网上下载地址,并且是破解版.[若没分,可以单独找我].因为非破解版的只有15天的使用限制.         打开界面如 ...