今天考了 (NOI Online 3) ,感觉很奇怪。
(T1) 就是个很 (NC) 的贪心,随便写写就过了。
(T2) 考试的时候竟然没有想出来,有点没懂,感觉很简单的啊,只拿了暴力 (70) 分走人。
(T3) 出题人毕老爷再世?基本和 吉夫特 这题一模一样,直接 (3^{log_2 val}) 就可以艹过去,而且跑的蛮快,然后各位神仙们写的子集卷积有点卡常?感觉不是很懂。
(T1)
假设我们最后选择的是第 (i) 个瓶子,那么第 (i+1sim n) 个瓶子是没法对它产生贡献的。
由于 (A_i) 是非负的,所以我们考虑让尽可能多的瓶子对答案产生贡献。
然后可以发现,和 (i) 的距离大于 (k) 的瓶子没法产生贡献(没法走到 (i) ),其余的,我们从距离为 (k) 的点开始,直接一带一路,可以发现都能对答案产生贡献。
所以我们求一个前缀和,每个位置的答案就是 (sum_i - sum_{max(0,i-k-1)}) 。
所有位置的答案取个 (max) 就是我们要求的结果。
(T2)
我们定义一个 (a imes b) 的矩阵 (A) 和一个 (b imes c) 的矩阵 (B) 相乘,得到一个 (a imes c) 的矩阵 (C) ,其中 (C) 满足:
我们设 (E) 为该图的邻接矩阵,其大小为 (n imes n) 。
我们再设 (G) 为 (1 imes n) 的矩阵,其中 (G_{1,i}) 表示第 (i) 个点的初始答案。
那么显然,进行了 (k) 次操作以后,答案就是 (G imes E^k) 。
然后我们就得到了一个暴力的做法:每次直接快速幂求出 (E^k) ,时间复杂度为 (O(qn^3log k)) 。
这东西显然是过不去的,考虑优化。
我们先求出所有的 (E^{2^i}) ,这一部分的时间复杂度为 (O(n^3log k)) 。然后对 (k) 进行二进制拆分,每次将 (G) 乘上一个 (E^{2^i}) 。由于 (G) 是 (1 imes n) 的,所以每次乘时间复杂度为 (O(n^2)) ,最多乘上 (log k) 次,所以单次查询时间复杂度为 (O(n^2log k)) 。
所以总复杂度降为 (O(n^3log k + qn^2log k)) ,可以通过全部的测试点。
(T3)
考虑优秀子序列的限制是什么。
可以发现,如果存在某一位,满足子序列中有至少 (2) 个值该位为 (1) ,那么一定是不合法的。
所以一个优秀子序列,一定是满足每一位至多有一个数为 (1) 。
我们设 (f_T) 表示有多少个优秀子序列所有数的异或和为 (T) (容易发现它们的和此时也为 (T) )。
我们枚举每一个数作为子序列的结尾,考虑怎么转移。可以发现此时转移到的 (T) 一定是 (val_i) 的超集,转移方程为:
最后的答案就是 (sum_{T} f_T imes 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 inom{n}{i} 2^{n-i}) 。
然后这东西根据二项式定理可知为 (3^k) 。