二维$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.查 ...
随机推荐
- redis GEO的使用
一.概念 redis的GEO特性在Redis3.2版本发布,这个功能可以将用户给定的地理位置信息储存起来,并对这些信息进行操作. GEO常用语LBS(Location Based Service),基 ...
- 前后端API交互如何保证数据安全性
前后端分离的开发方式,我们以接口为标准来进行推动,定义好接口,各自开发自己的功能,最后进行联调整合.无论是开发原生的APP还是webapp还是PC端的软件,只要是前后端分离的模式,就避免不了调用后端提 ...
- matlab安装与使用
Matlab安装和使用 百度网盘连接:https://pan.baidu.com/s/1aHPeAkNofCuwyYopnva4Mg 提取码:ci96 下载完成后: 将R2017b_win64_dvd ...
- 有关mysql的utf8和utf8mb4,以及Illegal mix of collations for operation 'like'
参考以下几个帖子: https://www.cnblogs.com/install/p/4417527.html https://blog.csdn.net/Yetmoon/article/detai ...
- CSS知识整理
1. 权重问题(CSS优先级): 继承或 * :0,0,0,0 标签:0,0,0,1 每个类,伪类:0,0,1,0 每个ID:0,1,0,0 每个行内式:1,0,0,0 !important:无穷大 ...
- 原子性atomic/nonatomic
原子性:并发编程中确保其操作具备整体性,系统其它部分无法观察到中间步骤,只能看到操作前后的结果. 决定编译器生成的getter和setter是否原子(natomic)操作. i 因此,atomic ...
- Android笔记(五十四) Android四大组件之一——ContentProvider(一)
ContentProvider提供数据 在Android中,他的每个应用都是相互独立的,各自运行在自己的Dalvik虚拟机中,但现实使用中常常需要在多个应用之间进行数据交换,例如发短信需要获取联系人中 ...
- 浦发银行网上银行U盾证书无法更新的解决办法
浦发银行需要更新证书.很多浦发客户都会碰到题主一样更新证书失败的困扰.网银登录似乎一切正常,可是等待进入个人网银时却跳出提示,如下图: 没有选择,只能点击确定,然后就是: 再“确定”下去: 再确定就出 ...
- 【HICP Gauss】数据库 环境的搭建 -1
1.安装规则 1.主机名必须网络唯一 2.主机名必须两位数以上 可以中划线 不能下划线 3.固定IP地址 4.端口号 1888 新增账户 omm 用户组 dbgrp ,家目录 /home/ ...
- docker 基本常用操作做
docker 基本常用操作做(只列举入门常用的命令) 容器生命周期管理 docker run :创建一个新的容器并运行一个命令 -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDO ...