题意

题目链接

Sol

二维线段树空间复杂度是多少啊qwqqq

为啥这题全网空间都是\(n^2\)还有人硬要说是\(nlog^2n\)呀、、

对于这题来说,因为有修改操作,我们需要在外层线段树上也打标记,而且标记的形式是对一段区间赋值。所以我们对每个标记需要开线段树来维护更改的位置

而且由于我们pushdown的时候是从一棵线段树里找出标记下传,pushup的时候是从子树的线段树总找出最大值上传,显然复杂度会爆炸,那么我们考虑标记永久化

具体来说,我们在写线段树的时候,如果在一段区间上打了赋值标记,显然他的子树都会受到影响。而一段区间的最大值又会对其父亲产生影响,那么直接开两个数组记录一下

然后在递归的过程中处理一下标记就行了

// luogu-judger-enable-o2
// luogu-judger-enable-o2
// luogu-judger-enable-o2
/* */
#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int MAXN = 2001, INF = 1e9 + 10;
void chmin(int &a, int b) {a = (a < b ? a : b);}
void chmax(int &a, int b) {a = (a > b ? a : b);}
int sqr(int x) {return x * x;}
inline int read() {
char c = getchar(); int x = 0, f = 1;
while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
int N, M, Q;
struct InSeg {
int rt[MAXN], ls[MAXN], rs[MAXN], mx[MAXN], tag[MAXN], tot;
void update(int k) {
mx[k] = max(mx[ls[k]], mx[rs[k]]);
}
void ps(int k, int v) {
chmax(mx[k], v);
chmax(tag[k], v);
}
void pushdown(int k) {
if(!tag[k]) return ;
if(!ls[k]) ls[k] = ++tot;
if(!rs[k]) rs[k] = ++tot;
ps(ls[k], tag[k]); ps(rs[k], tag[k]);
tag[k] = 0;
}
void IntMem(int &k, int l, int r, int ll, int rr, int v) {
if(!k) k = ++tot;
if(ll <= l && r <= rr) {ps(k, v); return ;}
pushdown(k);
int mid = l + r >> 1;
if(ll <= mid) IntMem(ls[k], l, mid, ll, rr, v);
if(rr > mid) IntMem(rs[k], mid + 1, r, ll, rr, v);
update(k);
}
int Query(int k, int l, int r, int ll, int rr) {
if(!k) return 0;
if(ll <= l && r <= rr) return mx[k];
pushdown(k);
int mid = l + r >> 1, ans = 0;
if(ll <= mid) chmax(ans, Query(ls[k], l, mid, ll, rr));
if(rr > mid) chmax(ans, Query(rs[k], mid + 1, r, ll, rr));
return ans;
}
};
int ls[MAXN], rs[MAXN], rtag[MAXN], rmx[MAXN], tot, root;
InSeg tag[MAXN], mx[MAXN];
void IntMem(int &k, int l, int r, int a, int b, int ll, int rr, int v) {
if(!k) k = ++tot;
mx[k].IntMem(rmx[k], 1, M, ll, rr, v);
if(a <= l && r <= b) {
tag[k].IntMem(rtag[k], 1, M, ll, rr, v);
return ;
}
int mid = l + r >> 1;
if(a <= mid) IntMem(ls[k], l, mid, a, b, ll, rr, v);
if(b > mid) IntMem(rs[k], mid + 1, r, a, b, ll, rr, v);
}
int Query(int k, int l, int r, int a, int b, int ll, int rr) {
if(!k) return 0;
int ans = tag[k].Query(rtag[k], 1, M, ll, rr);
if(a <= l && r <= b) return max(ans, mx[k].Query(rmx[k], 1, M, ll, rr));
int mid = l + r >> 1;
if(a <= mid) chmax(ans, Query(ls[k], l, mid, a, b, ll, rr));
if(b > mid) chmax(ans, Query(rs[k], mid + 1, r, a, b, ll, rr));
return ans;
}
signed main() {
N = read(); M = read(); Q = read();
while(Q--) {
int d = read(), s = read(), h = read(), x = read(), y = read();
//printf("**%d %d %d %d %d\n", x + 1, x + d, y + 1, y + s, h);
IntMem(root, 1, N, x + 1, x + d, y + 1, y + s, Query(root, 1, N, x + 1, x + d, y + 1, y + s) + h);
}
printf("%d\n", Query(1, 1, N, 1, N, 1, M));
return 0;
}
/*
7 5 4
4 3 2 0 0
3 3 1 3 0
7 1 2 0 3
2 3 3 2 2
*/

洛谷P3437 [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. BZOJ4785 [Zjoi2017]树状数组 【二维线段树 + 标记永久化】

    题目链接 BZOJ4785 题解 肝了一个下午QAQ没写过二维线段树还是很难受 首先题目中的树状数组实际维护的是后缀和,这一点凭分析或经验或手模观察可以得出 在\(\mod 2\)意义下,我们实际求出 ...

  3. 洛谷 P3688 - [ZJOI2017]树状数组(二维线段树+标记永久化)

    题面传送门 首先学过树状数组的应该都知道,将树状数组方向写反等价于前缀和 \(\to\) 后缀和,因此题目中伪代码的区间求和实质上是 \(sum[l-1...n]-sum[r...n]=sum[l-1 ...

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

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

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

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

  6. 洛谷 P1972 [SDOI2009]HH的项链-二维偏序+树状数组+读入挂(离线处理,思维,直接1~n一边插入一边查询),hahahahahahaha~

    P1972 [SDOI2009]HH的项链 题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含 ...

  7. 洛谷 P3438 - [POI2006]ZAB-Frogs(乱搞/李超线段树)

    题面传送门 首先一眼二分答案,我们假设距离 \((i,j)\) 最近的 scarefrog 离它的距离为 \(mn_{i,j}\),那么当我们二分到 \(mid\) 时我们显然只能经过 \(mn_{i ...

  8. 洛谷 P3437 [POI2006]TET-Tetris 3D 解题报告

    P3437 [POI2006]TET-Tetris 3D 题目描述 The authors of the game "Tetris" have decided to make a ...

  9. 洛谷 P3437 [POI2006]TET-Tetris 3D

    二维线段树区间更新啊 树套树的外层树,如果是线段树的话一般似乎不能打标记?(毕竟标记不好下传) 然而起码对于这题是可以的...对于外层线段树,每个节点放两个内层线段树dat和setv,分别是得到的值和 ...

随机推荐

  1. tomcat JNDI Resource 配置

    最近公司的项目慢慢开始向Maven项目迁移, 部分配置文件公共组也帮我们做了些改动,其中在spring的applicationContext.xml中看到了数据连接bean存在两个,一个是jndi 一 ...

  2. Google 团队效能研究 | 为什么雇用最聪明的人是远远不够的?

    简评:Google 的一项团队效能研究结果,可能会让你重新认识如何建立一个优秀的团队. Google 的搜索业务可能最为人所知,但 Google 可不仅仅有搜索业务,它可能还是最擅于大数据研究的公司之 ...

  3. 大数据技术之_19_Spark学习_01_Spark 基础解析小结(无图片)

    1.准备安装包 2.Spark Standalone 即独立模式  2.1.解压安装包到你安装的目录.  2.2.拷贝 conf 目录下的 slaves 文件,将 slave 节点的 hostname ...

  4. (转)Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)

    原文:https://www.cnblogs.com/chenwolong/p/reduce.html 函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数 ...

  5. (转)MySQL 5.6 OOM 问题解决分享

    本文来自:杨德华的原创分享 | MySQL 5.6 OOM 问题解决分享 原文:http://www.cnblogs.com/zhoujinyi/p/5763112.html 延伸阅读:Linux的内 ...

  6. 安装Elasticsearch5.0 部署Head插件

    部署5.0版本的ES 5.0版本的ES跟之前的版本最大的不同之处就是多了很多环境的校验,比如jdk,max-files等等. 设置内核参数 vi /etc/sysctl.conf # 增加下面的内容 ...

  7. 关于Oracle中的字符的比较

    1.Oracle比较字符串是根据ASCII码来的,第一个字母的ASCII大小比较如果相等再比较下一个: 函数来说明: CREATE OR REPLACE FUNCTION MinOrMax(para1 ...

  8. MySQL的Sleep进程占用大量连接解决方法

    第一部分为产生大量sleep进程的原理及对应解决方法第二部分为设置wait_timeout值,有效减少sleep进程 ========================================= ...

  9. 启动mongodb和redis服务器

    一.mongodb sudo service mongod start sudo service mongod restart sudo service mongod stop 二.redis red ...

  10. 堆排序详解以及java实现

    前言 临近毕业,开始找工作,近期一直在看算法导论(CLRS)同时各种刷题.希望以后有时间把所有学习心得和刷题心得记录下来. 堆 堆排序和合并排序一样,是一种时间复杂度为O(nlgn)的算法,同时和插入 ...