NOI Online 3 题解

今天考了 \(NOI\ Online\ 3\) ,感觉很奇怪。

\(T1\) 就是个很 \(NC\) 的贪心,随便写写就过了。

\(T2\) 考试的时候竟然没有想出来,有点没懂,感觉很简单的啊,只拿了暴力 \(70\) 分走人。

\(T3\) 出题人毕老爷再世?基本和 吉夫特 这题一模一样,直接 \(3^{\log_2 val}\) 就可以艹过去,而且跑的蛮快,然后各位神仙们写的子集卷积有点卡常?感觉不是很懂。

\(T1\)

假设我们最后选择的是第 \(i\) 个瓶子,那么第 \(i+1\sim n\) 个瓶子是没法对它产生贡献的。

由于 \(A_i\) 是非负的,所以我们考虑让尽可能多的瓶子对答案产生贡献。

然后可以发现,和 \(i\) 的距离大于 \(k\) 的瓶子没法产生贡献(没法走到 \(i\) ),其余的,我们从距离为 \(k\) 的点开始,直接一带一路,可以发现都能对答案产生贡献。

所以我们求一个前缀和,每个位置的答案就是 \(sum_i - sum_{\max(0,i-k-1)}\)

所有位置的答案取个 \(\max\) 就是我们要求的结果。

\(T2\)

我们定义一个 \(a\times b\) 的矩阵 \(A\) 和一个 \(b\times c\) 的矩阵 \(B\) 相乘,得到一个 \(a\times c\) 的矩阵 \(C\) ,其中 \(C\) 满足:

\[C_{i,j} = \oplus_{k=1}^{b} A_{i,k} \times B_{k,j} \]

我们设 \(E\) 为该图的邻接矩阵,其大小为 \(n\times n\)

我们再设 \(G\)\(1\times n\) 的矩阵,其中 \(G_{1,i}\) 表示第 \(i\) 个点的初始答案。

那么显然,进行了 \(k\) 次操作以后,答案就是 \(G \times E^k\)

然后我们就得到了一个暴力的做法:每次直接快速幂求出 \(E^k\) ,时间复杂度为 \(O(qn^3\log k)\)

这东西显然是过不去的,考虑优化。

我们先求出所有的 \(E^{2^i}\) ,这一部分的时间复杂度为 \(O(n^3\log k)\) 。然后对 \(k\) 进行二进制拆分,每次将 \(G\) 乘上一个 \(E^{2^i}\) 。由于 \(G\)\(1\times n\) 的,所以每次乘时间复杂度为 \(O(n^2)\) ,最多乘上 \(\log k\) 次,所以单次查询时间复杂度为 \(O(n^2\log k)\)

所以总复杂度降为 \(O(n^3\log k + qn^2\log k)\) ,可以通过全部的测试点。

\(T3\)

考虑优秀子序列的限制是什么。

可以发现,如果存在某一位,满足子序列中有至少 \(2\) 个值该位为 \(1\) ,那么一定是不合法的。

所以一个优秀子序列,一定是满足每一位至多有一个数为 \(1\)

我们设 \(f_T\) 表示有多少个优秀子序列所有数的异或和为 \(T\) (容易发现它们的和此时也为 \(T\) )。

我们枚举每一个数作为子序列的结尾,考虑怎么转移。可以发现此时转移到的 \(T\) 一定是 \(val_i\) 的超集,转移方程为:

\[f_T += f_{T\oplus val_i} \]

最后的答案就是 \(\sum_{T} f_T \times \varphi(1 + T)\) ,由于 \(\varnothing\) 没有被纳入考虑,所以我们还要在加上 \(1\)

\(k = \log_2^{mx\_val}\) ,那么直接这样做是可以被卡到 \(n2^k\) 的。

我们考虑将相同的数合并起来,那么转移方程就变为了:

\[f_T += f_{T\oplus val_i} \times cnt_{val_i} \]

需要注意的是,当 \(val_i=0\) 时,我们需要单独处理,此时 \(f_0 = 2^{cnt}-1\) ,同时 \(f_T,T>0\) 需要乘上 \(2^{cnt}\)

此时的时间复杂度就变成了 \(3^k\) ,实测在卡满的情况下,只需要 \(1s\) 即可。

关于时间复杂度的证明

我们优化后,总的计算量为: \(\sum_{i=0}^k \binom{n}{i} 2^{n-i}\)

然后这东西根据二项式定理可知为 \(3^k\)

posted @ 2020-05-24 16:12  TheShadow  阅读(361)  评论(0编辑  收藏  举报