20260714
T1
传送门
首先对于一个排列,\(T=\sum_{i=1}^{n}a_i\times i\)。由于 \(i\) 越大,权重越大,所以将 \(a\) 排序计算 \(T\) 一定是最优的。
现在把一次操作转化成删除一个数再加进一个数。
设旧数为 \(a\) 新数为 \(b\), \(a\) 的位置为 \(w_0\)(多个值取),\(b\) 的位置为 \(w_1\)。设前缀和数组为 \(s\),\(T\) 为开始产奶量。
位置可以用二分做。
考虑分类讨论。
当 \(w_1\le w0\) 时
- 删 \(a\) 减小 \(a\times w_0\),加 \(b\) 增加 \(bw_1\)。操作前 \([w_1,w_0-1]\) 的数位置都加 \(1\)。于是再加 \(s_{w_1-1}-s_{w_0-1}\)。
- 即为 \(T-aw_0+bw_1+s_{w_0-1}-s_{w_1-1}\)。
当 \(w_0\lt w1\)
- \(a\) 一样,但加 \(b\) 时前面少了一个数,所以是 \(b(w_1-1)\), 同时 \([w_0+1,w_1-1]\) 都减 1。
- 即为 \(T-aw_0+b(w_1-1)-s_{w_1-1}+s_{w_0}\)。
T2
长脑子题。
每一行只有 \(18\) 个字符,很显然要状压,搜索什么的。那么把每行转化成一个二进制数就会更好做。
使用状压 DP, 设 \(f_i\) 为状态 \(i\) 在数组的最大汉明距离,但等一下。
发现无论怎么做,这个 DP 都不好转移。
开始樟脑,一个数想在数组中找最大汉明距离,那么它取补码就变成找最小的了。因为每个有差异的位置都变得没差异了。
严谨一些,使用反证法:设找的数为 \(a\), 取补码后为 \(b\)。
如果 \(b\) 找有最小距离的数,设其为 \(c\),如果 \(c\) 不是与 \(a\) 有最大距离的数,就说明还有更大距离的数 \(d\),但这样 \(d\) 与 \(b\) 的距离就比 \(c\) 和 \(b\) 小了。矛盾。
重设 \(f_i\) 为最小的距离。使用我为人人。
\(f_i+1 \to f_{i\oplus(1<<j)}\)
T3
设 \(f_i\) 为前 \(i\) 个字符以 \(i\) 结尾的连续字串出现 \(bessie\) 的次数。答案即为 \(\sum_{i=1}^{n}f_i\)。
则 \(f_i=f_{j-1}+j\) 其中 \(j\) 为上一次出现 \(bessie\) 的 \(b\) 的位置。同时为前面贡献 \(j\)。
考虑求 \(j\)。
遍历 \(i\) 时设 \(g_k\) 为上一次出现前 \(bessie\) 中 \(i\) 个字符 \(b\) 的位置。列 \(6\) 个式子。
比如 \(g_3=g_2\),\(g_1=(s[i]==char(b))\)。注意要先 \(g_4=g_3\) 再 \(g_3=g_2\)。

浙公网安备 33010602011771号