2022.7.20 闲话

有人说这个闲话太学术了,那就:

真·闲话

寻找自我真的很难。

认识自我也真的很难。

已经快一年了,

却还是难以承认我真的放手了的事实。

也不是不承认,但是,我真的有必要继续执拗于一段情意绵绵,一套铅笔橡皮尺子吗?

让我从生活中除名对别人会有任何影响吗?

不会。

有时不明白自己为什么还挖空心思,放在根本不可能收到成果的事情上面。

我是傻吗?

也许是吧。

这个是 APJifengc 的填词,根本不是 cv 的 yspm 的!

好了闲话写完了 .


注意到神鱼的两篇闲话:7.37.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

posted @ 2022-07-20 20:48  Jijidawang  阅读(114)  评论(3编辑  收藏  举报
😅​