BZOJ1513 [POI2006]Tet-Tetris 3D 【二维线段树】
题目链接
题解
真正地理解了一波线段树标记永久化的姿势
每个节点维护两个值\(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 【二维线段树】的更多相关文章
- 【BZOJ1513】[POI2006]Tet-Tetris 3D 二维线段树
[BZOJ1513][POI2006]Tet-Tetris 3D Description Task: Tetris 3D "Tetris" 游戏的作者决定做一个新的游戏, 一个三维 ...
- bzoj 1513 POI2006 Tet-Tetris 3D 二维线段树+标记永久化
1511: [POI2006]OKR-Periods of Words Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 351 Solved: 220[S ...
- 洛谷.3437.[POI2006]TET-Tetris 3D(二维线段树)
题目链接 下落一个d*s的方块,则要在这个平面区域找一个最高的h' 更新整个平面区域的值为h+h' 对于本题,维护最大高度h和all 对于平面的x轴维护一棵线段树t1,每个t1的节点维护对应y轴的两棵 ...
- 洛谷P3437 [POI2006]TET-Tetris 3D(二维线段树 标记永久化)
题意 题目链接 Sol 二维线段树空间复杂度是多少啊qwqqq 为啥这题全网空间都是\(n^2\)还有人硬要说是\(nlog^2n\)呀.. 对于这题来说,因为有修改操作,我们需要在外层线段树上也打标 ...
- UVA 11297 线段树套线段树(二维线段树)
题目大意: 就是在二维的空间内进行单个的修改,或者进行整块矩形区域的最大最小值查询 二维线段树树,要注意的是第一维上不是叶子形成的第二维线段树和叶子形成的第二维线段树要 不同的处理方式,非叶子形成的 ...
- POJ2155 Matrix二维线段树经典题
题目链接 二维树状数组 #include<iostream> #include<math.h> #include<algorithm> #include<st ...
- HDU 1823 Luck and Love(二维线段树)
之前只知道这个东西的大概概念,没具体去写,最近呵呵,今补上. 二维线段树 -- 点更段查 #include <cstdio> #include <cstring> #inclu ...
- poj 2155:Matrix(二维线段树,矩阵取反,好题)
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 17880 Accepted: 6709 Descripti ...
- poj 1195:Mobile phones(二维线段树,矩阵求和)
Mobile phones Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 14391 Accepted: 6685 De ...
- POJ 2155 Matrix (二维线段树)
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 17226 Accepted: 6461 Descripti ...
随机推荐
- fabric Report API
1.Token生成 接口 : post https://fabric.io/oauth/token 请求头:Headers Content-Type : application/json 正文: bo ...
- linux进程篇 (一) 进程的基本概念
进程是系统资源分配的最小单位. 1.创建和执行 父进程通过 fork 系统调用创建子进程, 子进程被创建后,处于创建状态. linux为子进程配置数据结构,如果内存空间足够,子进程就在内核中就绪,成为 ...
- Python3爬虫(十二) 爬虫性能
Infi-chu: http://www.cnblogs.com/Infi-chu/ 一.简单的循环串行一个一个循环,耗时是最长的,是所有的时间综合 import requests url_list ...
- HBase配置和使用
参考官方文档 整体实现框架 图1 以下几个为组成部件 21892 HMaster 22028 HRegionServer 21553 QuorumPeerMain 2366 NameNode 2539 ...
- ArcPy:GeoJSON转ArcGIS Geometry
import arcpy geojson = {"type":"Polygon","coordinates":[[[120.81878662 ...
- 最后一片蓝海的终极狂欢-写在Win10发布前夕
作为一名Windows8.x+系统平台从业者,从工作伊始,耳边不断充斥着Windows将走向没落的言论,Win10今日晚些时候即将发布,笔者借此机会,说说自己的看法. 早在2012年的时候,IDC曾预 ...
- [电子书] 《Android编程兵书》PDF
Android编程兵书 内容简介: 这是一本Android开发书籍,内容讲解详细,例子丰富,能帮助读者举一反三.在<Android编程兵书>中,每一个知识点的描述都非常详细,并且每一个知识 ...
- iOS笔记054 - 核心动画
注意事项 :locationInView和translationInView // 返回相对于控件自身内部触摸点的位置 [pan locationInView:self]; // 返回两个触摸点之间的 ...
- git部署详解
1.1 关于版本控制 1.1.1 本地版本控制 本地版本控制系统 许多人习惯用复制整个项目目录的方式来保存不同的版本,或许还会改名加上备份时间以示区别.这么做唯一的 好处就是简单,但是特别容易犯错.有 ...
- Python 学习笔记之 Numpy 库——数组基础
1. 初识数组 import numpy as np a = np.arange(15) a = a.reshape(3, 5) print(a.ndim, a.shape, a.dtype, a.s ...