QOJ.ac

QOJ

Type: Editorial

Status: Open

Posted by: Anonymous

Posted at:

Last updated:

Back to Problem

New Editorial for Problem #22882

由于数值之间等价,所以一个 trivial 的想法是 $n=60$ 时可以直接记录前缀 $a$ 形成的出现次数的可重集,状态数由分拆数分析,复杂度 $O(np(n))$。在 $n=100$ 时总状态数是 $2\times10^9$ 以上的,无法接受。

优化 1:只关心众数的种类数,所以将状态变为,记录每个数值出现次数距离出现次数最大值的差构成的可重集 $S$,以及最大值的出现次数 $c$,状态为 $(c,S)$,可以对一些等价状态进行合并,但量级仍然没有下降。

优化 2:设还有 $rem$ 个数没有填,那么若 $x>rem,x\in S$ 说明 $x$ 对应的数值不可能成为众数,可以直接从 $S$ 中删除。这个优化十分有限,写个 dp 计算状态数大概是 $2\times10^8$ 左右,无法接受。

优化 3:如果 $x=rem$,那么也可以从 $S$ 中删除,算的几乎是对的。但是 $x$ 仍然可能成为众数,所以这里需要一步小的容斥:从 $S$ 中删除就是让计算序列 $b$ 时忽略 $x$ 的影响,但是会算错 $x$ 在最后一步成为众数的情况,用容斥修,则最后一步的修正形如 $(w_{n,c+1}-w_{n,c})$。

这就引出一个子问题,可以在统计众数时钦定一些元素没有贡献。猜测最终拆分数大概需要一个对 $n$ 的折半,而 $p(50)$ 是 $2\times10^5$ 级别,这就不能只限制一个元素 $\leq rem$,考虑往一个集合的和 $\leq rem$ 编。

虽然优化 3 对优化 2 本身优化不大,但是这个 corner case 的优化提示我们用容斥处理限制。一个形式是对 $([统计b算i]-[统计b不算i])$ 相乘的组合意义拆开。如果选算众数时不考虑这个数,会带 $-1$ 的系数。那么有 $[算i]=[不算i]$ 的情况就直接消除。对于一个集合 $S$,考虑算这个式子,如果 $\sum S>rem$,那么一定有一个数不会被翻成众数,就直接没有贡献了。

这两个方向就是说用容斥算新的子问题的答案,但是加起来的贡献仍然是原问题。形式化地写一下,设 $F(S)$ 为统计众数中只考虑可重集 $S$ 的贡献,那上述过程实质上是 $G(S)=\sum_{T\subseteq S}(-1)^{|S|-|T|}F(T),F(S)=\sum_{T\subseteq S}G(T)$。而 $\sum S>rem$ 时 $G(S)=0$。原来(优化 0,1,2,3)统计的是 $F$,现在统计的是 $G$。考虑 $F(A)\to F(B)$ 的贡献系数,则 $A\subset B$ 时贡献 $0$,否则 $A=B$ 时贡献 $1$,所以如此转化成 $G$ 后只会留下 $F(S)$。或者可以直接理解成 $\prod([b不算i]+([b算i]-[b不算i]))$ 拆掉括号。

优化 4:dp 状态变为考虑 $G(S)$,$S$ 外的数都是不影响众数统计的,则状态数限制 $\sum S_i\leq rem$,有一个类似于 $\min(t,n-t)$ 的限制,这时总状态数是 $10^7$ 的。转移精细实现一下,枚举所有可能的 $S$ 并且用多进制状物存状态即可通过。

总复杂度 $O(p(\frac n2)poly(n))$。

Comments

No comments yet.