二维$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.查 ...
随机推荐
- 开源图像识别库OpenCV基于Maven的开发环境准备
1.安装 JDK 8+,并设置 JAVA_HOME 环境变量 2.安装 Maven,并将 “/bin” 子目录设置到 path 环境变量 3.下载 OpenCV,官网传送门 也可以直接下载本人瘦身之后 ...
- Appium_Page object设计模式
Page object设计模式思维,把app按页面去划分,一个页面就是一个page对象 每个页面的元素集中管理.页面上按钮操作方法单独封装 # __author__ = " Caric Le ...
- python 包 安装 加速 pip anaconda
使用 -i 参数指定源,豆瓣的很快: pip install web.py -i http://pypi.douban.com/simple anaconda: ~/.condarc channels ...
- H3C S3600V2 通过CONSOLE配置端口镜像
前24口为百兆口 对应序号为 Ethernet 1/0/(0~24) 25 26为千兆口 对应序号为 GigabitEthernet 1/0/(25~26) 以下是通过25号千兆口监听1号百兆口的例子 ...
- js 的七大原则--单一原则、开闭原则、替换原则(一)
一.前言: js 的七大设计原则: 1.单一原则 2.开闭原则 3.里氏替换原则 4.依赖倒转原则 5.接口隔离原则 6.合成复用原则 7.迪米尔法则 二.单一原则 1.定义:单一原则就是一个对象或者 ...
- HTML学习摘要5
DAY 5 HTML <address> 元素定义文档或文章的联系信息(作者/拥有者). 此元素通常以斜体显示.大多数浏览器会在此元素前后添加折行. HTML <cite> 元 ...
- C++线程同步与互斥之互斥体
抢红包练习 第一步:在第一个文本框中输入一个值,比如1000: 第二步:点击抢红包,同时创建3个线程,每个线程循环进行抢红包的操作,每次抢50; 第三步:使用Mutex进行线程控制,当第一个文本框中的 ...
- stm32 USART_IT_IDLE中断 一帧数据
USART_IT_IDLE中断,是串口收到一帧数据后,发生的中断.也可以叫做一包数据 USART_IT_IDLE和USART_IT_RXNE区别 当接收到1个字节,会产生USART_IT_RXNE中断 ...
- Python学习日记(十二) 匿名函数
匿名函数: 未解决一些简单的需求而设计的函数 语法: func = lambda x : x**2 func:函数名 lambda:类似def的关键字 x:参数 x**2:返回值表达式 适用内置函数: ...
- buffer和cache区别?
写入数据到内存里,这个数据的内存空间称为缓冲区(buffer) 从内存读取数据,这个存储数据的内存空间称为缓存区(cache) 由于大部分网站以读取为主,写入为辅,所以并发写入一般不是问题.