【BZOJ1513】[POI2006]Tet-Tetris 3D 二维线段树
【BZOJ1513】[POI2006]Tet-Tetris 3D
Description
Input
Output
Sample Input
4 3 2 0 0
3 3 1 3 0
7 1 2 0 3
2 3 3 2 2
Sample Output
题解:还是给一个直来直去的题面吧:给你一个平面,每次将一个矩形中的所有数改为(矩形中的最大数+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 二维线段树的更多相关文章
- 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 ...
随机推荐
- 关于并发,异步,非阻塞(python)疑惑的一些资料解答
从iterable/iterator到generator到coroutine理解python的迭代器: http://python.jobbole.com/81916/理解python的生成器: ht ...
- pc_lint的用法转
PC-Lint是一款C/C++软件代码静态分析工具,不仅可以检查一般的语法错误,还可以检查潜在的错误,比如数组访问越界.内存泄漏.使用未初始化变量.使用空指针等.在单元测试前使用PC-Lint来检查代 ...
- 【AS3 Coder】任务五:Flash 2D游戏的第二春(中)
在上一节中,我们介绍了如何构建我们小小的90度角RPG游戏的背景,在这一节中我将为列位带来重头戏部分,隆重介绍我们的主角及NPC登场,噔噔噔噔……掌声在哪里?! 额,没听到掌声,罢了,直接开场吧. 本 ...
- 4. 使用别的json解析框架【从零开始学Spring Boot】
转载:http://blog.csdn.net/linxingliang/article/details/51585921 此文章已经废弃,请看新版的博客的完美解决方案: 78. Spring Boo ...
- HttpURLConnection读取网页文件
一.关键代码 public class MainActivity extends Activity { TextView content; ; Handler handler = new Handle ...
- Linux组件封装(二)中条件变量Condition的封装
条件变量主要用于实现线程之间的协作关系. pthread_cond_t常用的操作有: int pthread_cond_init(pthread_cond_t *cond, pthread_conda ...
- Wamp访问缓慢、本地主机访问缓慢解决方案
Wamp访问缓慢.本地主机访问缓慢解决方案 Wamp访问速度缓慢可能的原因: 1.一般原因: Wamp的日志文件太大.处理办法,将位于wamp/logs/下的日志文件清空. ...
- c语言用rand() 函数,实现random(int m)
函数rand()是真正的随机数生成器.而srand()会设置供rand()使用的随机数种子. 假设你在第一次调用rand()之前没有调用srand(),那么系统会为你自己主动调用srand(). 注意 ...
- CentOS6.8 SVN服务器管理多项目
一 需求 一般来说,公司有多个项目,在搭建好SVN服务器之后,就需要使用SVN来实现不在一个项目中的开发人员不能访问其它项目中的代码. 假设: 有3个项目:project1.project2.proj ...
- VBA 按列查找小工具类似lookUp函数
如上图,查找A列的数据在D,F列是否存在,如果存在背景色变绿,如果不存在则A列的背景色变红. 直接贴上代码: Private Sub CommandButton1_Click() Call lookU ...