Subset Product Problem (AGC 205 E)

First Post:

Last Update:

Word Count:
806

Read Time:
3 min

Page View: loading...

给定一个长为 的非负整数序列

对于每个下标 ,求:

下文使用 表示值域。

Algo 1

暴力做法,查询时枚举子集,修改操作 ,查询操作

Algo 2

暴力做法,插入时枚举超集,修改操作 ,查询操作

Algo 3

考虑根号分治,平衡复杂度,对前 位应用做法 1,后 位应用做法 2。

显然单次操作复杂度是 的。

Algo 4

一个复杂度更高的做法。

注意到,如果没有 的限制,则可以进行一个 sosdp/FMT/FWT 计算贡献。

考虑一个分块/根号重构。

令块长为 ,每加进来一个整块,进行 sosdp 处理贡献,单次 ,对于块内贡献,暴力枚举,单次复杂度

平衡复杂度,总复杂度

Algo 5

神仙做法。

基于随机化,单次操作期望

考虑每个数的贡献方式,对于每一位,若这一位为 ,则要贡献到 上;若这一位为 ,则贡献到 上。

写成矩阵就是

这个贡献可以在插入时处理,也可以在查询时处理,从这个视角看,Algo 1 和 Algo 2 就是将矩阵拆成了如下乘积的形式:

当然,这个拆分是 trivial 的,但是,还有一个不太 trivial 的拆分:

对每一位随机分配一种贡献方式,注意到每一位有 的概率被枚举 次, 的概率只被枚举 次,平均被枚举 次。

因此单次期望复杂度

由于随机存在方差,可以多随几次取最小操作次数。