闲话 Day9

发布时间 2023-05-30 21:00:26作者: Houraisan_Kaguya

闲话 Day3:

所以,就不得不功利化一点了。

而实际上呢。。。

这是什么,有意思,研究一下。
这是什么,好优秀,实现一下。
这是什么,计数题,绿的,不会,下一个。
这是什么,计数题,黄的,不会,下一个。
。。。。。

我终于意识到了做事凭兴趣这一点是很难改变的。

所以这几天又去仔细参悟了一下分治与分治数据结构。
本来想记下来的,但是感觉东西很多很费时间。
所以等过几天再说吧。
大概在南京的时候会写一写吧。

这次是学术闲话来着,所以就把刚刚口胡出来的东西写一写吧。


线段树分治

这道题正解貌似是点分治一类的东西。
但是我记得在模拟赛里面遇到这个题的时候题解给的是线段树分治。
事实上,使用线段树分治 + \(O(1)\) LCA 可以做到 \(O(n \log n)\) 的时空复杂度。
还是非常优秀的。

然而,今天突然就想到了一个问题:
线段树分治的空间复杂度能不能做线性。

(主要是参悟了分治数据结构与分治的关系之后感觉很可做)

事实证明可以做到而且并不难想。

首先前置知识,为什么线段树区间修改的复杂度是对的。

当一个区间在线段树上向下递归的时候,分为两种情况:

  1. 左右都不贴边界。
  2. 贴左边界或贴右边界。

容易发现,对于第一种情况,最多只会分裂一次,然后变成两个贴边界的区间。
而对于第二种情况,要么单向递归,要么双向递归但是其中一边是满的。
而满的区间显然就不会向下递归了。

所以最终的复杂度为 \(O(\log n)\),严谨分析的话最多会访问 \(4 \times \log n\) 个点,修改最多影响到 \(2 \times \log n\) 个点。

好了回到原问题,线段树分治。

假如现在有 \(m\) 个区间,我们先不把它们都下放到线段树对应节点上,先统一堆到根节点。
现在我们要去遍历整棵树了,到达一个节点的时候再去把区间都下方。

首先考虑左右都不贴边界的情况,显然不会影响空间复杂度。
毕竟都是单向递归,而且只会分裂一次。

再考虑贴左边界的情况,其实也好处理。
要么只向左递归,不考虑。
要么左右递归,但是向左递归的部分直接就是整个节点修改,所以贡献是 \(O(1)\) 的。
而且接下来马上就要递归左子树了,马上就会被消掉。

最后考虑贴右边界的情况,这个有点寄。

如果只向右递归还是不用处理。
考虑左右都递归。
如果我们直接分裂到左右子树上,会导致某个区间直接霸占一整个左链的所有右儿子。
然后空间复杂度又变成 \(O(n \log n)\) 了。

事实上,我们可以先将其整个下放到左儿子上。
然后等左子树递归完了之后,再从左儿子那里拿回来。
然后下放到右子树,这个是 \(O(1)\) 的没有什么问题。

不理解的话可以手动模拟一下。
画出来其实有点像蕾米的翅膀来着。

这样的话相当于是一个递归又回溯的过程。
时间复杂度不变,一个区间还是只遍历 \(O(\log n)\) 个节点。
但是空间复杂度直接降到了 \(O(n)\) 而且常数并不大。
全是 vector 操作啊那没事了。

实现的话。。。
虽然看上去上述流程很麻烦而且还要分类讨论。
但是实际上写成递归函数的话也还好。
至少并没有比常规的线段树分治难写多少。

等我有时间了去实现一个,现在先咕咕咕。


上次报了个公开赛,但是只是看了看最后一题,没有打。
我自己也在 INOH 和 STAOI 分别出了一个题。

但是,出这些题的目的是什么?

如果只是为了难住别人的话那可就太闲了,属实无意义。
如果是为了分享某些 trick 的话其实可以写博客的。
而且像我这样自己啥都不会也没啥必要去往外分享东西。。。

然后我才发现貌似这次出题比较偏离本意了。

本来确实是发现了一个有意思的东西。
然后决定出个题玩玩。
然后发现其他方法跑得也很快,可以草过去。
然后就开始对着除了这个 trick 以外的地方卡常,叠科技。
然后把其他做法卡掉了。

每一步都和上一步衔接紧密,但是总的来看完全偏离了本意。

再考虑考虑,其实有很多的事情都是这个样子。
随着时间发展完全偏离了其本意,但是又处于某些原因无法废除/修改。
或者说,甚至很多人都没有意识到。

有一些想说的例子,但是不合适,不说了。
换一个经典无害的吧。
(怎么又举这种例子啊啊啊啊啊啊啊啊啊啊)

关于出题/考试。
考试原本的目的是啥来着,选拔人才是吧。
出题也就是全面考察一下知识掌握程度和综合素养一类的。

但是随着教育的发展这东西变成了啥。
学生开始去学做题套路,应试技巧,背一些前人总结下来的模板。
真的就是一些除了应付考试啥实际意义都没有的东西。

在闲话 Day3 里面貌似稍微提到了一点,不多说了。
当时感觉,只是因为沾了不少功利化的东西才会演变成这样。

但是现在看来好像并不是。即使功利无关也会这样。
我们周围确实就存在着大量类似的无意义的东西。
有些可能类似于形式主义吧,反正大体就是完全偏离本意。

经典例子,为啥键盘上的字母是乱序排布的。

在最开始,确实是顺序排布的。
但是当时的键盘有一个很大的问题,就是不能同时按两个键,否则就会卡死。

键位顺序排布确实很有利于提高打字效率。
但是打字快了就不可避免的会出现卡死的现象,反而降低了效率。

于是有个人就发明了现在的这种键盘。
特殊构造使得常用的词块隔得比较远
发售之后,由于其非常独特,当时非常火。
再加上确实不容易卡死(打字速度下降了不少),所以后来就成为了主流键盘,一直到现在。

大概总结一下,目的是提高效率避免卡死。

但是现在呢?
现在的键盘同时按下所有键都不会卡死的吧。
字母乱序排序一定程度上不仅降低了效率,还提高了上手难度。
然而现在再也看不到顺序排布的键盘了。
甚至没有人再去提起过这个东西。

随着时间的推移和时代的发展,键盘的结构违背了其本身的目的。

对此的一种解释是,兼容性问题,习惯问题。
多数人都习惯了乱序键盘,现在推出顺序键盘没有市场。
或者说,第一批使用顺序键盘就意味着要同时适应两种不同的键盘。

但是。。。。
当时改成乱序键盘就能适应,现在改回顺序键盘就无法适应是吧。

如果多数人都能去仔细考虑这个问题的话可能键盘模式早就改回去了。
或者,改成另一种效率更高的排布方式。
普及这种东西的成本可能要远低于普及 5G 或者新款手机一类的,毕竟并不是所有人都每天接触键盘。
而且带来的收益大概是非常大的。

所以最后得出的结论是,我真闲啊。

貌似多数人都不会在每个细节处都去考虑,这种设计的本意是什么。
因此,大量的偏离本意的东西就这样被人们忽视,然后起着负作用。

大概我是没有必要关心这种东西的吧。
但是多留意一下总是有好处的。
至少可以让我少做很多毫无意义的事情。

忘了听哪里说的了,你谷要取消博客了(????)
其实也好,至少不至于以后突然翻到了现在写的博客。
然后打开一看,答辩。
就像看小学写的作文一样。

这已经将近 40 天了吧,怎么才写了 ⑨ 期闲话。
。。。。。