关于二维线段树,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$线段树的更多相关文章

  1. 【BZOJ-3196】二逼平衡树 线段树 + Splay (线段树套平衡树)

    3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2271  Solved: 935[Submit][Stat ...

  2. 【BZOJ 3196】二逼平衡树 线段树套splay 模板题

    我写的是线段树套splay,网上很多人写的都是套treap,然而本蒟蒻并不会treap 奉上sth神犇的模板: //bzoj3196 二逼平衡树,支持修改某个点的值,查询区间第k小值,查询区间某个值排 ...

  3. bzoj 3196 && luogu 3380 JoyOI 1730 二逼平衡树 (线段树套Treap)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3196 题面; 3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Se ...

  4. BZOJ3196二逼平衡树——线段树套平衡树(treap)

    此为平衡树系列最后一道:二逼平衡树您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名2.查询区间内排名为k的值3.修改某一位值上的数值4.查询 ...

  5. BZOJ5291/洛谷P4458/LOJ#2512 [Bjoi2018]链上二次求和 线段树

    原文链接http://www.cnblogs.com/zhouzhendong/p/9031130.html 题目传送门 - LOJ#2512 题目传送门 - 洛谷P4458 题目传送门 - BZOJ ...

  6. BZOJ - 3196 Tyvj 1730 二逼平衡树 (线段树套treap)

    题目链接 区间线段树套treap,空间复杂度$O(nlogn)$,时间复杂度除了查询区间k大是$O(log^3n)$以外都是$O(log^2n)$的. (据说线段树套线段树.树状数组套线段树也能过?) ...

  7. 【bzoj3196】Tyvj 1730 二逼平衡树 线段树套Treap

    题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:1.查询k在区间内的排名2.查询区间内排名为k的值3.修改某一位值上的数值4.查询k在区间内的前驱(前驱定义 ...

  8. NYOJ 116 士兵杀敌(二)【线段树 单点更新】

    题意:题意非常清楚: 策略:如题. 这道题就是简单的线段树应用,据说还能够用树状数组来做,等我学了之后在说吧. 代码: #include<stdio.h> #include<stri ...

  9. [bzoj3196]Tyvj 1730 二逼平衡树——线段树套平衡树

    题目 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名 2.查询区间内排名为k的值 3.修改某一位值上的数值 4.查 ...

随机推荐

  1. Gym 102055B Balance of the Force

    大意: $n$个骑士, 第$i$个骑士若加入光明阵营, 那么能力值$L_i$, 加入黑暗阵营, 能力值$D_i$. 给定$m$个限制$(u_i,v_i)$, 表示$u_i,v_i$不能在同一阵营. 求 ...

  2. javascript 同源策略和 JSONP 的工作原理

    同源策略 同源策略是一个约定,该约定阻止当前脚本获取或操作另一域的内容.同源是指:域名.协议.端口号都相同. 简单地说,A 服务器下的 a 端口执行 ajax 程序,不能获取 B 服务器或者 A 服务 ...

  3. NetworkInterface网速监测

    private NetworkInterface[] nicArr; //网卡集合 private Timer timer; //计时器 public MainWindow() { Initializ ...

  4. 【开发笔记】- Linux命令大全

    系统信息  arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS ...

  5. 刚接触HTML5应该先学哪里才好?

    好吧,话不多说,直接来点干货吧! 刚接触html的小白都感觉摸不着头脑?应该怎么学习呢,其实HTML5可能对于还没有接触过的小白来说会比较的难,听起来也比较新颖.这是个什么骚东西!其实不然,这个就是构 ...

  6. jQuery常用知识点大总结

    目录 jQuery jQuery介绍 jQuery的优势 jQuery的引入方式有两种: jQuery对象和dom对象 jQuery选择器 基本选择器(同css) 基本筛选器(选择之后进行过滤): 属 ...

  7. 朴素贝叶斯算法源码分析及代码实战【python sklearn/spark ML】

    一.简介 贝叶斯定理是关于随机事件A和事件B的条件概率的一个定理.通常在事件A发生的前提下事件B发生的概率,与在事件B发生的前提下事件A发生的概率是不一致的.然而,这两者之间有确定的关系,贝叶斯定理就 ...

  8. mysql 开启日志与性能调优

    #查看日期情况 #show variables like '%general%'; #开启日志 #SET GLOBAL general_log = 'On'; #指定日志文件 #SET GLOBAL  ...

  9. Json序列化 总结

    案例总结:https://www.cnblogs.com/jsll/p/11855349.html public string Json_GetDepartment_Position(...)//st ...

  10. MySQL关闭缓慢

    Pre环境有个MySQL不能进行数据写入操作,关闭实例也非常慢,最后error报错. 最后发现是磁盘不能进行写操作. touch /data/testtouch: cannot touch ‘/dat ...