学军联赛模拟 第二十四测 题解

\(A\)

考虑按位计算贡献。 预处理组合数即可。

时间复杂度 : \(O(NlogN)\)

\(B\)

\(dp_{i}\) 表示到达 \(i\) 的最小花费。

枚举到达 \(i\) 是从哪里走来的 , 即可完成转移。

将状态转移方程合并 , 与 \(i\) , \(j\) , \(ij\) 有关的项合在一起 , 可以看成一个一次函数的形式。

那么用线段树维护一次函数最值即可。 另一种做法是用平衡树维护凸壳 , 比前者节省约十倍的常数。

时间复杂度 : \(O(NlogN)\)

\(C\)

首先不妨记录给定字符串在最近的 \(M\) 个串中的出现次数分别为 \(A_{1} , A_{2} ... A_{M}\)

对于一次拼接操作。 首先有原来的 \(A_{2}\) 变为 \(A_{1}\) , 原来的 \(A_{3}\) 变为 \(A_{2}\) , ... \(A_{M}\) 变为 \(A_{M - 1}\)

这样对于 \(2 - M\) 这些串相当于做了 "移位" 操作。

而对于新的拼接串 , 其出现次数为 \(A_{1} + A_{2} + ... + A_{M}\) , 还要加上拼接处的贡献。 由于拼接只可能是相邻两串的一个后缀 + 一个前缀的形式。 因此不妨记 \(C_{i , j}\) 表示原排列中的 \(i\) 和原排列中的 \(j\) 拼在一起新产生了多少个 \(S\)

于是最近 \(M\) 个串的信息就可以用 \(M + M ^ 2\) 个变量的值维护。

进一步地 , 用矩阵乘法优化这个过程。

时间复杂度 : \(O(QM ^ 6logM)\)

posted @ 2020-11-20 23:07  evenbao  阅读(124)  评论(0编辑  收藏  举报