树分治
这部分知识是我的弱项,之前学习时也没有听懂。此前碰到这类题也会想尽办法用数据结构代替,但发现非常不可做,代码复杂程度极高。而且感觉之前我连普通的区间分治都不太熟练,没有学好的信心。现在学习过后好了很多,理解了分治的核心(也许),就是每次到分治的关键点就去统计包含关键点的答案,然后去递归子区间,然后根据具体的题目要求选取合适的数据结构维护信息。记得之前做过一道时间复杂度为 \(O(n\log n)\) 的题目,但是我当时不能熟练运用树状数组所以尝试用线段树替代,然后被卡了很谔谔,后经高人指点终于懂得要选用常熟小、复杂度尽量低、代码写起来较为简单的数据结构,更关键的是要正确判断题目需要维护的信息的性质。
关于具体的树分治,它分成点分和边分。点分治就是每次在当前树中选择最优点(一般是重心)为根,然后 dfs 子树维护信息、更新答案。因为每次选择最优点作为树根,所以所有分治点暴力 dfs 的复杂度总共为 \(n\log n\) 的,加上维护信息的复杂度(比普通维护多了一只 \(\log\) 应该?)是比较优秀的。虽然一些复杂的数据结构时间复杂度可能比它低,但是在巨大的常数下也甘拜下风。
后面的边分治与在线点分治(点分树)都是属于能够理解但代码对我来说比较困难所以还没有写,明天自习也只是看情况,因为感觉点分治可代替他们,只是实现需要加一点科技。现在还是多写几道 dsu 和 点分治的题熟悉熟悉,确保考试碰到有大概率做出来才是正道!
做题
下午写了几道题感觉收获较大,但是这两天的代码还不是很熟悉吧。准备明天不写太多题,就把板子多熟悉一下,保证在理解算法的情况下能够稳稳写出来!
最后走之前一直在和 xjy 讨论点分治与 dsu 的关系,感觉它们之间联系挺大的,很多题如果能用其中一个去写,那么极大概率也能用另一个去实现。就比如点分治的板子题,xjy 在用点分治写出后没有去赶做题进度,而是尝试用 dsu 重新完成此题,并且他有一些疑惑也在询问我,我在给他讲解的同时也同时加深对这两种算法的印象、理解与思考,以及一些小小的技巧吧也许(?),还有最重要的注意事项。
最后在晚饭后他也靠自己成功 AC,想必他一定非常开心吧!在 AC 后他也积极与我交流一些有关东西,感觉挺不错!他的精神值得我学习!我也不要再去有意无意去赶进度了,不要把做题看得太重!谨记!
最后
本来晚上说去九眼桥转一圈的,未果。晚上没有干啥,就稍微看了一下这两天得板子,在 B 站上看了一些科普类的视频,有收获。今天运用量有点大,累了,睡觉去了。记录一下写文章时听的音乐:feel the fire。豪庭!
标签:数据结构,20,dsu,2024.8,复杂度,分治,维护,随笔,log From: https://www.cnblogs.com/Nekopedia/p/18370488