2022.7.20 闲话
有人说这个闲话太学术了,那就:
真·闲话
寻找自我真的很难。
认识自我也真的很难。
已经快一年了,
却还是难以承认我真的放手了的事实。
也不是不承认,但是,我真的有必要继续执拗于一段情意绵绵,一套铅笔橡皮尺子吗?
让我从生活中除名对别人会有任何影响吗?
不会。
有时不明白自己为什么还挖空心思,放在根本不可能收到成果的事情上面。
我是傻吗?
也许是吧。
这个是 APJifengc 的填词,根本不是 cv 的 yspm 的!
好了闲话写完了 .
注意到神鱼的两篇闲话:7.3,7.14,所以我们还是要写点学术的 .
谈时间维上分治的一些应用
定期重构类
按时间分块,隔一会做一次(真正的)操作
Period 1(根号重构)
维护一个序列 \(\{a_n\}\),支持:
- 区间加
- 单点求值
强制在线 .
差分变成单点加区间求和,树状数组即可
设一个块长 \(B\),每次修改我们不做实际修改,每 \(B\) 次才做一次真正的修改,差分前缀和一下可以 \(O(n)\) .
中间的询问我们直接扫一遍当前块,如果区间对单点有贡献就加上,最后再把前面的块的贡献补上(已经算好).
于是这样的时间复杂度为 \(O\left(n\cdot\dfrac qB+qB\right)\),取 \(B=\sqrt n\) 得到最优复杂度 \(O(n\sqrt n)\) .
似乎和直接分块没区别啊
Gty的妹子树
维护一棵树,支持:
- 查询子树中点权 \(>x\) 的个数 .
- 单点改点权 .
- 在某个点下面接一个点 .
强制在线 .
首先有一个可持久化线段树做法:
首先求出原树 DFS 序,然后前两个操作就就可以可持久化线段树乱杀了,第三个操作似乎难做,于是暴力重构 .
然后根号重构即可(需要用一个栈存询问)
动态 DFT
维护一个序列 \(\{a_n\}\)(保证 \(n-1\) 是 2 的次幂),支持:
- 单点修改 .
- 单点查询 \(\operatorname{DFT}(a)\) .
其中 \(\operatorname{DFT}(a)\) 定义为:
\[\operatorname{DFT}(a)_i=\sum_{j=0}^nb_j\omega_{n-1}^{ij} \]其中 \(\omega\) 是单位根 .
用类似做法可以做到 \(\Theta(q\sqrt{n\log n})\) .
存在 \(\Theta(n\log n + q\sqrt n)\) 做法 .
Period 2(二进制分组)
std :: set
维护一个集合,支持:
- 插入 .
- 求一个数的排名 .
强制在线 .
维护若干个数组,大小分别为 \(2^0,2^1,\dots,2^k\) .
每次插入直接插最前然后强制排序,如果两个数组大小相等则合并 .
每个段最多被合并 \(\log\) 次(因为二进制加法器的均摊分析原理),于是复杂度为 \(O(n\log^2n)\) .
String Set Queries
维护一个字符串集合,支持三种操作:
- 加字符串 .
- 删字符串 .
- 查询集合中的所有字符串在给出的模板串中出现的次数 .
强制在线 .
AC 自动机 + 二进制分组,和上例类似 .
Others
以下是博客签名,正文无关
本文来自博客园,作者:Jijidawang,转载请注明原文链接:https://www.cnblogs.com/CDOI-24374/p/16499567.html
版权声明:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0)进行许可。看完如果觉得有用请点个赞吧 QwQ