杂项

远古答辩
我也看不懂。

这里抽出来两个 OI 中常见的模型,来分析一下这些东西能做到多好。


1

Q(S,x),给出一个参数 x 和集合 S,查询其答案。
性质 1:对于一个集合 S,我们可以在 O(|S|) 的复杂度内进行预处理,而后 O(1) 回答 Q(S,x)
性质 2:Q(AB,x)=Q(A,x)+Q(B,x),其中 + 是一种可以 O(1) 完成的运算。

问题 1:
初始有一个空集 S,支持两种操作:插入一个元素 xS 中,查询 Q(S,y)。允许离线。

这个就是经典的 CDQ 分治了。
在时间轴上分治,每次将 mid 之前插入的元素放在一起预处理,然后把答案加在 mid 之后的询问上。
复杂度 O(nlogn)

问题 2:
初始有一个空集 S,支持两种操作:插入一个元素 xS 中,查询 Q(S,y)。强制在线。

还是 CDQ 分治。
考虑我们的分治是对时间轴进行的,所以本身就是从左到右的过程。
将递归过程刻画成树,其实就是对树进行 DFS。
我们动态维护这个过程即可。

当然,还有一种等价的理解方式为二进制分组。
考虑每次加入一个元素就新开一个集合,每当出现两个相同大小的集合的时候就合并成一个并预处理。
不难发现总复杂度 O(nlogn)

问题 3:
初始有一个空集 S,支持两种操作:插入一个元素 xS 中,删除 S 中的一个元素,查询 Q(S,y)。允许离线。

使用线段树分治。
对于每个元素,其生存周期为 [l,r],直接挂到线段树上。
对于线段树上的每个节点,进行预处理。
总复杂度 O(nlogn)

问题 4:
初始有一个空集 S,支持两种操作:插入一个元素 xS 中,删除 S 中的一个元素,查询 Q(S,y)。强制在线。

这里就不好用分治做了。
使用分块,每 n 个划分到同一个集合里面,删除就重构。
总复杂度 O(nn)

至于为什么这个问题无法做到 O(nlogn),有一个感性理解的方法。
考虑现在 S 中有 n 个元素。
我们首先进行查询。设这次查询访问了 a 个集合,首先应当满足这 a 个集合的并为 S
则这 a 个集合大小的和不小于 n,因此最大的集合的大小不小于 na
接下来删除这个最大集合中的一个元素。会导致这个集合作废。
因此,两次操作产生的总复杂度为 O(a+na)
所以复杂度只能做到 O(nn)

在有其他特殊性质的时候也许会做到更优。例如 + 可逆,或是存在其他答案计算方式(而不是只能 O(|S|) 预处理 O(1) 查询)
以及,这里是最坏情况。如果可以依赖随机性不知道能不能做......
但是 + 可重复贡献并不算特殊性质。上述证明过程涵盖了 + 可重复贡献的情况。

对于问题 1, 2, 3,O(nlogn) 已经是复杂度下限了。因为归约单点加区间求和。


2

Q(S,x),给出集合 S 和参数 x,询问其答案。
性质 1:允许严格 O(1)S 中插入元素。
性质 2:计算 Q(S,x) 复杂度 O(1)

这个,感性理解的话,动态图连通性?
(可以加边,不能删边,两个并查集不能合并)

问题 1:初始有一个空集 S,支持两种操作:插入一个元素 xS 中,删除 S 中的一个元素,查询 Q(S,y)。允许离线。

线段树分治。没啥好说的了。
允许严格 O(1) 插入其实也就意味着操作可撤销。

问题 2:初始有一个空集 S,支持两种操作:插入一个元素 xS 中,删除 S 中的一个元素,查询 Q(S,y)。强制在线。

这个还没什么好的做法。只能给到 O(n2)
感性理解一下的话就是,先查询一次,则必须要维护一个集合 A 包含全部的元素。
考虑 A 中第一个加进去的元素,我们将其删除,并保证后面不再加入。
这个时候如果暴力撤销是 O(n) 的,直接把集合 A 扔掉仍然会导致 O(n) 的势能作废。
所以也就是 O(n2) 了。

added:为什么在线可以这么分析离线不可以。
因为强制在线的话可以根据现有的结构决定操作。
但是离线的话是根据操作决定结构。

问题 3:初始有一个空集 S,支持两种操作:插入一个元素 xS 中,删除 S 中的一个元素,查询 Q(S,y)。强制在线。
保证一个性质:先加入的元素先被删除。

这个就是我们 baka's trick 了。
写过,丢链接跑路。
复杂度 O(nlogn)


3

这部分还没搞明白。有点困难的。

Q(S,x),给出集合 S 和参数 x,询问其答案。
性质 1:允许向 S 中插入元素,并产生 O(1) 的势能。
性质 2:计算 Q(S,x) 复杂度 O(1)
其中,势能可能会在插入/计算时部分释放,O(1) 的势能会贡献 O(1) 的复杂度。

直接点名路径压缩并查集就行了......吗?
带按秩合并的并查集单次永远不会超过 O(logn),毕竟高度有限。
但是这个模型里面可能会攒 O(n) 的势能然后一次释放。

问题 1:初始有一个空集 S,支持两种操作:插入一个元素 xS 中,删除 S 中的一个元素,查询 Q(S,y)。强制在线。
保证一个性质:先加入的元素先被删除。

这里有可能是 O(nlog2n) 的。
考虑队列图连通性的线段树算法。这里每个点至多被增删 O(logn) 次。
(考虑每个点的祖先节点被加入/删除时自己才会被影响)
因此,无论势能在哪个位置被释放,至多只会被重复 O(logn) 次。
所以总复杂度不超过 O(nlog2n),不知道能不能分析到更优。

问题 2:初始有一个空集 S,支持两种操作:插入一个元素 xS 中,删除 S 中的一个元素,查询 Q(S,y)。允许离线。

不会。

posted @   Houraisan_Kaguya  阅读(75)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示