二维$MLE$线段树
关于二维线段树,ta死了
先来看看两种二维线段树的打法
1.四叉树

然而ta死了,ta是$\Theta (n)$的,加上线段树的常数,$T$飞稳
2.线段树套线段树
我尽量画出来...

图中每个方块是一棵线段树

画完长这样(你们凑合看吧,作者已经半卒了)

局部放大图
现在每个圆点代表真正的一个点
接下来的讲解以今天的题为例(题面就不放了)
先说区间修改

假设我们现在要给图中的$9$个绿点赋值(仔细找,相信你能找到

按照一维线段树的做法,我们会修改这六个绿点
但这是$\Theta (NlogN)$的,会$T$
我们可以是这对蓝点进行操作

然后我们就可以只修改图中的四个绿点了
代码:
struct Tree
{
struct tree
{
int tag;
}t[maxn<<2];
void down(int k)
{
int tmp=t[k].tag;
t[l(k)].tag=max(t[l(k)].tag,tmp);
t[r(k)].tag=max(t[r(k)].tag,tmp);
}
void change(int k,int l,int r,int L,int R,int v)
{
if(L<=l&&r<=R){t[k].tag=v;return;}
down(k);int mid=(l+r)>>1;
if(L<=mid) change(l(k),l,mid,L,R,v);
if(mid<R) change(r(k),mid+1,r,L,R,v);
}
}T[maxn<<2];
void change(int k,int l,int r,int L,int R,int ll,int rr,int v)
{
if(L<=l&&r<=R){T[k].change(1,1,maxn-1,ll,rr,v);return;}
int mid=(l+r)>>1;
if(L<=mid) change(l(k),l,mid,L,R,ll,rr,v);
if(mid<R) change(r(k),mid+1,r,L,R,ll,rr,v);
}
接下来是单点查询

我们要查图中的绿点
但是我们并不能只查询这一个点,因为下图中三个黄色的方块里都有关于这个绿点的信息

所以我们只要一边向下走一边查询取$max/min$就可以了
代码:
int query(int k,int l,int r,int p)
{
if(l==r) return t[k].tag;
down(k);int mid=(l+r)>>1;
if(p<=mid) return query(l(k),l,mid,p);
else return query(r(k),mid+1,r,p);
}
int query(int k,int l,int r,int p1,int p2)
{
if(l==r){return T[k].query(1,1,maxn-1,p2);}
int ans=T[k].query(1,1,maxn-1,p2),mid=(l+r)>>1;
if(p1<=mid) return max(ans,query(l(k),l,mid,p1,p2));
else return max(ans,query(r(k),mid+1,r,p1,p2));
}
以及完整代码:
struct Tree
{
struct tree
{
int tag;
}t[maxn<<2];
void down(int k)
{
int tmp=t[k].tag;
t[l(k)].tag=max(t[l(k)].tag,tmp);
t[r(k)].tag=max(t[r(k)].tag,tmp);
}
void change(int k,int l,int r,int L,int R,int v)
{
if(L<=l&&r<=R){t[k].tag=v;return;}
down(k);int mid=(l+r)>>1;
if(L<=mid) change(l(k),l,mid,L,R,v);
if(mid<R) change(r(k),mid+1,r,L,R,v);
}
int query(int k,int l,int r,int p)
{
if(l==r) return t[k].tag;
down(k);int mid=(l+r)>>1;
if(p<=mid) return query(l(k),l,mid,p);
else return query(r(k),mid+1,r,p);
}
}T[maxn<<2];
void change(int k,int l,int r,int L,int R,int ll,int rr,int v)
{
if(L<=l&&r<=R){T[k].change(1,1,maxn-1,ll,rr,v);return;}
int mid=(l+r)>>1;
if(L<=mid) change(l(k),l,mid,L,R,ll,rr,v);
if(mid<R) change(r(k),mid+1,r,L,R,ll,rr,v);
}
int query(int k,int l,int r,int p1,int p2)
{
if(l==r){return T[k].query(1,1,maxn-1,p2);}
int ans=T[k].query(1,1,maxn-1,p2),mid=(l+r)>>1;
if(p1<=mid) return max(ans,query(l(k),l,mid,p1,p2));
else return max(ans,query(r(k),mid+1,r,p1,p2));
}
关于其他操作,有空在更(基本没空了
二维$MLE$线段树的更多相关文章
- 【BZOJ-3196】二逼平衡树 线段树 + Splay (线段树套平衡树)
3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2271 Solved: 935[Submit][Stat ...
- 【BZOJ 3196】二逼平衡树 线段树套splay 模板题
我写的是线段树套splay,网上很多人写的都是套treap,然而本蒟蒻并不会treap 奉上sth神犇的模板: //bzoj3196 二逼平衡树,支持修改某个点的值,查询区间第k小值,查询区间某个值排 ...
- bzoj 3196 && luogu 3380 JoyOI 1730 二逼平衡树 (线段树套Treap)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3196 题面; 3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Se ...
- BZOJ3196二逼平衡树——线段树套平衡树(treap)
此为平衡树系列最后一道:二逼平衡树您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名2.查询区间内排名为k的值3.修改某一位值上的数值4.查询 ...
- BZOJ5291/洛谷P4458/LOJ#2512 [Bjoi2018]链上二次求和 线段树
原文链接http://www.cnblogs.com/zhouzhendong/p/9031130.html 题目传送门 - LOJ#2512 题目传送门 - 洛谷P4458 题目传送门 - BZOJ ...
- BZOJ - 3196 Tyvj 1730 二逼平衡树 (线段树套treap)
题目链接 区间线段树套treap,空间复杂度$O(nlogn)$,时间复杂度除了查询区间k大是$O(log^3n)$以外都是$O(log^2n)$的. (据说线段树套线段树.树状数组套线段树也能过?) ...
- 【bzoj3196】Tyvj 1730 二逼平衡树 线段树套Treap
题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:1.查询k在区间内的排名2.查询区间内排名为k的值3.修改某一位值上的数值4.查询k在区间内的前驱(前驱定义 ...
- NYOJ 116 士兵杀敌(二)【线段树 单点更新】
题意:题意非常清楚: 策略:如题. 这道题就是简单的线段树应用,据说还能够用树状数组来做,等我学了之后在说吧. 代码: #include<stdio.h> #include<stri ...
- [bzoj3196]Tyvj 1730 二逼平衡树——线段树套平衡树
题目 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名 2.查询区间内排名为k的值 3.修改某一位值上的数值 4.查 ...
随机推荐
- 颜色转换、随机、16进制转换、HSV
颜色转换.随机.16进制转换.HSV: /** * * *-----------------------------------------* * | *** 颜色转换.随机.16进制转换.HSV * ...
- 从create-react-app开始,构建项目架构
1.生成项目 命令行执行:create-react-app myapp,生成如下结构: 2.安装sass依赖,让你在项目中可以使用scss模块化,index.module.scss: npm i n ...
- Spring Cloud Alibaba学习笔记(17) - Spring Cloud Gateway 自定义路由谓词工厂
在前文中,我们介绍了Spring Cloud Gateway内置了一系列的路由谓词工厂,但是如果这些内置的路由谓词工厂不能满足业务需求的话,我们可以自定义路由谓词工厂来实现特定的需求. 例如有某个服务 ...
- java之struts2之文件上传
1.在大多数应用中,都有文件上传功能.有两种文件上传的方式,一种是自己去解析http协议,获取文件上传的内容.另一种是通过第三方插件来实现文件上传.第三方插件一般有两种,smartfileupload ...
- Thomas Brinkhoff 基于路网的移动对象生成器的使用[第二版]
Thomas Brinkhoff 基于路网的移动对象生成器的使用 Thomas Brinkhoff 基于路网的移动对象生成器的使用 相关操作的说明 相关文件的说明 运行 导入eclipse后运行时选择 ...
- 深入理解JVM(五) -- 垃圾回收算法
上篇文章我们了解到哪些内存区域和哪些对象可以被回收,这篇文章我们就来了解一下具体的垃圾回收算法的思路,不讨论具体的实现. 一 最基础算法 标记-清除(Mark-Swap) 为什么说他是最基础的算法,因 ...
- JS权威指南读书笔记(五)
第十三章 Web浏览器中的JavaScript 1 在Html文档中嵌入客户端4种JS代码方法 a 内联方式,放置在<script>标签之间 b 放置在<script ...
- 【新手可看懂】ubuntu配置appium环境
1.node安装: 在node官网:https://nodejs.org/en/download/ 下载对应的安装包(这里建议下载最新的版本)下载好后放在liunx指定路径下 我这里放到opt这个文件 ...
- Java经典逻辑编程50题 (转)
注: 转自https://blog.csdn.net/Alias_fa/article/details/52985112 (摘了题目部分和部分分析,想看原作代码的见原作链接) [程序1] 題目:古典 ...
- 卷积神经网络快速入门【基于TensorFlow】
一.概述 卷积神经网络[Convolutional neural networks]里面最重要的构建单元是卷积层.神经元在第一个卷积层不是连接输入图片的每一个像素,只是连接它们感受野1的像素,以此类推 ...