题目链接

BZOJ1513

题解

真正地理解了一波线段树标记永久化的姿势

每个节点维护两个值\(v\)和\(tag\)

\(v\)代表儿子中的最值

\(tag\)代表未下传的最值

显然节点的区间大于等于\(v\)的实际区间

而\(tag\)的区间包含节点的区间

我们在修改的时候,沿路\(v\)都要修改,底层\(tag\)修改

我们在查询的时候,沿路\(tag\)都要查询,底层\(v\)查询

\(upd:\)理解层面上看,和普通线段树是一样的嘛,,,,

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<map>
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define mp(a,b) make_pair<int,int>(a,b)
#define cls(s) memset(s,0,sizeof(s))
#define cp pair<int,int>
#define LL long long int
#define ls (u << 1)
#define rs (u << 1 | 1)
using namespace std;
const int maxn = 4005,maxm = 5000005,INF = 1000000000;
inline int read(){
int out = 0,flag = 1; char c = getchar();
while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}
while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}
return out * flag;
}
int n,D,S;
struct segx{
int mx[maxm],lc[maxm],rc[maxm],tag[maxm],cnt;
void modify(int& u,int l,int r,int L,int R,int v){
if (!u) u = ++cnt; mx[u] = max(mx[u],v);
if (l >= L && r <= R){tag[u] = max(tag[u],v); return;}
int mid = l + r >> 1;
if (mid >= L) modify(lc[u],l,mid,L,R,v);
if (mid < R) modify(rc[u],mid + 1,r,L,R,v);
}
int query(int u,int l,int r,int L,int R){
if (!u) return 0;
if (l >= L && r <= R) return mx[u];
int mid = l + r >> 1,ans = tag[u];
if (mid >= R) return max(ans,query(lc[u],l,mid,L,R));
if (mid < L) return max(ans,query(rc[u],mid + 1,r,L,R));
return max(ans,max(query(lc[u],l,mid,L,R),query(rc[u],mid + 1,r,L,R)));
}
}Seg;
struct segy{
int rt[maxn],tag[maxn];
void modify(int u,int l,int r,int L,int R,int ll,int rr,int v){
Seg.modify(rt[u],1,S,ll,rr,v);
if (l >= L && r <= R){Seg.modify(tag[u],1,S,ll,rr,v); return;}
int mid = l + r >> 1;
if (mid >= L) modify(ls,l,mid,L,R,ll,rr,v);
if (mid < R) modify(rs,mid + 1,r,L,R,ll,rr,v);
}
int query(int u,int l,int r,int L,int R,int ll,int rr){
if (l >= L && r <= R) return Seg.query(rt[u],1,S,ll,rr);
int mid = l + r >> 1,ans = Seg.query(tag[u],1,S,ll,rr);
if (mid >= L) ans = max(ans,query(ls,l,mid,L,R,ll,rr));
if (mid < R) ans = max(ans,query(rs,mid + 1,r,L,R,ll,rr));
return ans;
}
}T;
int main(){
D = read(); S = read(); n = read();
int d,s,h,x0,y0,x,y,xx,yy;
while (n--){
d = read(); s = read(); h = read(); x0 = read(); y0 = read();
x = x0 + 1; y = y0 + 1; xx = x0 + d; yy = y0 + s;
h += T.query(1,1,D,x,xx,y,yy);
T.modify(1,1,D,x,xx,y,yy,h);
}
printf("%d\n",T.query(1,1,D,1,D,1,S));
return 0;
}

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

  1. 【BZOJ1513】[POI2006]Tet-Tetris 3D 二维线段树

    [BZOJ1513][POI2006]Tet-Tetris 3D Description Task: Tetris 3D "Tetris" 游戏的作者决定做一个新的游戏, 一个三维 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. 2017年PHP程序员未来路在何方?(转载)

    PHP 从诞生到现在已经有 20 多年历史,从 Web 时代兴起到移动互联网退潮,互联网领域各种编程语言和技术层出不穷, Node.js . GO . Python 不断地在挑战 PHP 的地位.这些 ...

  2. springcloud生态图

    springcloud生态图

  3. Win7下如何安装python pygame的whl包

    看了小甲鱼的python教程,对那个python版本的打飞机游戏很感兴趣,尝试运行,居然报错了,提示缺少pygame包: 仔细一看需要安装一个pygame的包,默认安装好python是不包括这个包的, ...

  4. 预防跨站脚本(xss)

    对xss的防护方法结合在两点上输入和输出,一是严格控制用户表单的输入,验证所有输入数据,有效监测到攻击,go web表单中涉及到.二是对所有输出的数据进行处理,防止已成功注入的脚本在浏览器端运行. 在 ...

  5. Go语言中的UDP应用

    Go语言中的UDP应用 Go语言中使用UDP是很方便的,net包提供了UDP和TCP的功能,这里使用UDP做了一个UDP广播,然后接收各个设备的返回信息.实现起来很快,总体感觉比使用C#中的UDP更优 ...

  6. (数据科学学习手札17)线性判别分析的原理简介&Python与R实现

    之前数篇博客我们比较了几种具有代表性的聚类算法,但现实工作中,最多的问题是分类与定性预测,即通过基于已标注类型的数据的各显著特征值,通过大量样本训练出的模型,来对新出现的样本进行分类,这也是机器学习中 ...

  7. 使用localStorage,sessionStorage,cookie等存储

    Web 存储 API 提供了 sessionStorage (会话存储) 和 localStorage(本地存储)两个存储对象来对网页的数据进行添加.删除.修改.查询操作. 特点: localStor ...

  8. 2002: [Hnoi2010]Bounce 弹飞绵羊

    2002: [Hnoi2010]Bounce 弹飞绵羊 https://www.lydsy.com/JudgeOnline/problem.php?id=2002 分析: 绵羊在弹飞的路径中相当于一棵 ...

  9. Python字符串处理:过滤字符串中的英文与符号,保留汉字

    使用Python 的re模块,re模块提供了re.sub用于替换字符串中的匹配项. re.sub(pattern, repl, string, count=0) 参数说明: pattern:正则重的模 ...

  10. linux 操作之一 如何在linux将本地数据*.sql文件导入到linux 云服务器上的mysql数据库

    liunx 版本ubuntu 16.4 mysql 版本  5.6 1)准备*.sql文件 (* 是准备导入的sql文件的名字) 2)liunx 远程客户端  SecureCRT 7.0 alt+p ...