谈一类神奇的数据结构——猫树@慕课网原创慕课网

猫树是一个有趣的数据结构,之前一直觉得这玩意儿应该很玄学,但学了之后发现还是挺朴素也挺好打的数据结构

要说两者之间的区别,大概就是询问(和修改)的复杂度了

首先线段树的询问复杂度肯定是O(logn)O(logn)的,这点没什么毛病吧?

然后猫树的询问复杂度呢?猫树的询问复杂度是O(1)O(1)

究其原因的话还是普通线段树的log基本是跑不满的(所以说可能我数据造太烂了吧...)

但是不要小看这个“快一两倍”,这已经不是常数的问题了啊!(何况这只是我不大靠谱的测试)

就好像莫队的小优化能快个将近一倍之类的...

那么修改?

线段树当然还是O(logn)O(logn)

但是猫树就要O(n)O(n)了,这个等到下面讲算法思路的时候就会提到了

所以说基本上猫树不用在待修改的区间询问题中(瞬间感觉没什么用了)

听你这么说,猫树不就是ST表么?

那么其实两者并不一样,因为他们能维护的信息范围不一样

线段树能维护的信息猫树基本都能维护,比如什么区间和、区间gcd、最大子段和等满足结合律且支持快速合并的信息

但是普通的ST表能够处理最大子段和么?(普通的st表当然不行,但用上猫树的思想就不一定了,博主没试过,有兴趣的读者可以考虑一下...)

说了这么多,该谈谈算法实现了吧?

我们假设当前查询的区间为l,r

那么我们是不是可以考虑把这个区间分成两份,然后如果我们已经预处理除了这两个区间的信息,是不是就可以合并得到答案了呢?

那么现在的问题就是怎么预处理这两个区间的信息

其实关键就是要考虑可以使得任意一种区间都能被分成两份处理过的区间

那么我们先考虑用线段树中类似分治的思想,预处理区间信息

我们考虑把1~n整个区间分成两份1~mid,mid+1~n

然后对于两分区间,我们先从mid和mid+1出发,O(n)O(n)地像两边去遍历区间中的每个元素,同时维护要处理的信息

等两个区间都处理完之后,我们再向下递归,将两个区间继续分下去,即迭代以上步骤直到区间表示的只有一个数

那么这样的复杂度是O(nlogn)O(nlogn)的,也就是预处理的复杂度并不比线段树差了

但是这里又有了一个问题:我们之前说过的要满足每个区间都能被分成两份预处理过的区间

那么我们就要证明这样的预处理能满足以上条件了

proof:

我们看图说话

我们可以发现,当选择任意两个点后,这两个点之间的区间必然可以用他们在这颗线段树上的LCALCA的中间点必然可以将这个区间分成两段已处理过信息的区间

你可以随意尝试一下(当然我图画的有点...)

(为什么会这么神奇...)

证明一下,我们先将当前的两个点表示在根节点上

我们发现这两个点并不能被当前所在点的中间点分为两份,于是我们将他们下移进入右节点

我们发现还是不能被中间点分成两份,继续下移

最后我们总能发现可以成功分割

但是呢,按照上面的找寻分割点的方法,我们发现好像复杂度还是O(n)O(n)的?(难道复杂度是假的?)

别急,上面只是证明分割的可行性,并不是找寻分割点的方法

之前我们有提到分割点在LCALCA上,所以我们只需要处理出LCALCA的位置就好了,难道用树剖或是倍增?复杂度还是没变啊!顶多变成了O(loglogn)O(loglogn)啊!

我们观察一下就可以发现(或者说根据线段树的性质来说),线段树中两个叶子结点的LCALCA其实就是他们位置编号的最长公共前缀(二进制下)

eg:(10001)2(10110)2(10001)2(10110)2两个节点的LCALCA就是(10)2(10)2

那么怎么快速求出两个数的最长公共前缀?

这里要用到非常妙的一个办法:

我们将两个数异或之后可以发现他们的公共前缀不见了,即最高位的位置后移了logLCA.lenlogLCA.len,其中LCA.lenLCA.len表示LCALCA节点在二进制下的长度

那么我们就可以预处理一下log数组,然后在询问的时候就可以快速求出两个询问节点的LCALCA所在的层了

等等,层?不用求出编号的么?

这里解释一下,为了省空间,我们考虑将同一层处理出的信息放在一个数组里,毕竟他们互相之间没有相交

并且,这么做的话,查询的时候就只需要得到LCALCA所在层,然后将l、r直接带入就可以合并求解了

以处理区间最大子段和为例:

就是上面的板子

其他的能拿来当纯模板的基本找不到(可见限制还是蛮大的,毕竟带修改的不行),不过一些要拿线段树来优化的题目(比如线段树优化dp)还是可以用上的...吧?

THE END
1.猫的外部形态结构我经常看的《猫和老鼠》中有许多笑点,我最喜欢的便是小杰瑞轻松打败比自己大的多的汤姆,但是,猫真的是那么笨笨的吗?NO!当你了解完猫的外部形态结构时就不会这么觉得了。 首先我从猫的脸部说起,猫的两只耳朵十分灵活,就像观测站的雷达一样,它的听力更是不容小觑,是人类的2倍以上;猫的眼睛在明亮的环境中,猫...https://www.meipian.cn/2bk7ujos
2.猫呼吸系统的详细介绍猫呼吸系统是一系列负责呼吸的器官和呼吸道,没有它们生命就不可能存在。它包括吸入空气和吸入氧气,以及从肺部呼出二氧化碳等废气。今天氧宠博士就跟大家聊一聊猫呼吸系统对猫咪的结构。 猫呼吸系统的结构 猫呼吸系统除了呼吸,呼吸道还有其他重要的作用,比如在空气进入身体之前给空气加湿和加热、捕获和排出外来物质、促进...https://www.isdpp.com/xq-5991.html
3.小猫作文作业通用指导教程三、小猫作文结构安排 1. 开头:描述小猫的外貌特征,如毛色、体型、眼睛等。 例句:我家的小猫叫小怪,它全身都是黑白相间的毛,不存在一根杂毛。 2. 主体:叙述小猫的故事或日常生活可以分为几个部分: (1)小猫的性:如吃相、玩耍、作息等。 例句:我家的小猫吃东西时,先闻一闻食物再动一动,确认木有再细嚼慢咽...http://www.slrbs.com/jrzg/aixuexi/244985.html
1.猫脸结构?喵百科第一种:楔形脸这是猫最常见的脸型,它也有很多不同的地方。布偶猫它们都有楔形的脸。只是嘴巴,眼睛...https://moecats.com/question/41358.html
2.七年级语文上册第16课《猫》课文解析四、结构层次 《猫》分三部分: 第一部分(1-2段):写第一只猫的故事。 第二部分(3-14段):写活泼可爱的第二只猫不幸亡失的故事。 第三部分(15-34段):写第三只猫的亡失让我难过自责。 五、课文分析 研读课文第一部分。 1、第一只猫从何而来?怎样写第一只猫的可爱? https://www.jianshu.com/p/5c5ba756e84e
3.《狗猫鼠》的读后感(精选34篇)著名的作家鲁迅先生,他对外自称是仇猫的。光从《狗.猫.鼠》就可以看出。这篇文章主要介绍了鲁迅仇猫,被嘲笑是狗。然后分析一些关于猫狗结构的传闻,最后是说猫和老鼠的渊源。 相较于狗,猫,鼠,我认识最多的当属猫了。不曾想到仇猫的原因竟可以有这么多,相比之下,我对猫是不怎么排斥的。鲁迅仇猫的原因之一...https://www.ruiwen.com/duhougan/2425940.html
4.猫的解剖结构和生理习性仅供个人参考猫的解剖结构和生理习性猫的骨骼:猫的眼睛的构造及视觉的产生:不得用于商业用途:卜輛If孔if婢才晶IV輛的障孔呈爭直狀*能曝盞視網膜龟覺強光的僅霍' 而且能卿議平同的光階”服購的構造光撼通過角聯臾水厲籃 楽篇鮭0UH膜的感光制1 此時神握衙動由報神耗博達卒川!的劇 尙陶持的垃計'm收集...https://m.renrendoc.com/paper/160092155.html
5.跟着cryptokitties(以太坊云养猫)学写智能合约(上)下面的代码定义了,猫业务核心数据。 mapping是以太坊智能合约的一种数据结构,它和JAVA里的hashmap,python里的dict是一样的,就是一张hash表。这张hash表是存储在以太坊智能合约上的。 kittes数组,所有的猫都会存储在kitties数组里,这个数组会不断增长,kittyId其实就是Kitty对象在这个数组中的下标。而kittyId其实就是...https://blog.csdn.net/mergerly/article/details/79086591
6.关于猫的牙科疾病大总结(2)隐窝内扁桃体:有口炎的猫,会导致肿胀/增生,疼痛,无法进食. (3)软腭:硬腭下边的位置。在做呼吸麻醉,插管的时候需要注意. 猫跟狗不太一样,它的黏膜容易水肿,导致窒息插管麻醉需注意 (4)口角:容易有口角炎导致猫食欲不振. (5)下唇系带:牵拉下嘴唇 ,稳定结构。 https://www.douban.com/note/825970879/
7.618必入,超值抢购!“猫星人的魔法箱”:3i智能猫砂舱M1,铲屎官必备神器...3i智能猫砂舱从四方面来帮助用户防脏,首先是智能补砂,智能监测猫砂厚度不足时,自动一次性补充1.5L猫砂,防止砂层过薄粘底;并且内置控砂走廊,动线合理防带砂,不需要单独购买控砂垫。除此之外它特有的平铲结构,不上下翻滚,可以有效避免扬尘和挂壁,且内仓采用防粘耐磨特殊材质,防脏污、防猫抓。https://news.pedaily.cn/20240530/86967.shtml
8.猫的心脏形状结构心血管猫的心脏形状、结构 ←→ 目录 出入心脏的大血管 位置与毗邻:心脏位于纵隔内,两肺之间,侧面和背面大部分被肺所覆盖。前端腹侧面与胸腺相邻。心脏投影约在第4或第5肋骨与第8肋骨之间。 出入心脏的大血管 肺动脉干:从动脉圆锥发出,分为左、右肺动脉。肺动脉干分叉的背侧面与主动脉弓之间有动脉韧带相连。左肺...http://www.tsu.tw/heart/jiepou/bijiao/174.html