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\) 满足:
我们设 \(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\) 的超集,转移方程为:
最后的答案就是 \(\sum_{T} f_T \times \varphi(1 + T)\) ,由于 \(\varnothing\) 没有被纳入考虑,所以我们还要在加上 \(1\) 。
设 \(k = \log_2^{mx\_val}\) ,那么直接这样做是可以被卡到 \(n2^k\) 的。
我们考虑将相同的数合并起来,那么转移方程就变为了:
需要注意的是,当 \(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\) 。