HN省队集训2024讲课题解
Nauuo and Pictures (hard version)
考虑 dp。
设 \(f_{id,i,j}\) 表示对于第 \(id\) 张图片,现在进行了 \(i\) 次操作,其中 \(j\) 次是将某数加一,权值的期望值。 \(\operatorname{O}(1)\) 转移是简单的。
这样时间复杂度是 \(\operatorname{O}(nm^2)\) 的,考虑优化。
考虑将每个照片拆成 \(w_i\) 个同类的且权值为 \(1\) 的照片,那么现在照片就只有两种:\(a_i\) 等于 \(1\) 或 \(a_i\) 等于 \(0\)。
那么就可以将 \(id\) 那一位去掉。 设 \(f_{i,j}\) 表示进行 \(i\) 次加一操作,\(j\) 次减一后的期望代价,有转移:
这样时间复杂度是 \(\operatorname{O}(m^2\log m)\),可以通过本题,但预处理逆元可以做到 \(\operatorname{O}(m^2)\)。
Anticube
首先有个想法:对每个 \(a_i\) 分解质因数,然后用 \(map\) 找到与之冲突的数,取两者中间出现最多的数。
但这样是 \(\operatorname{O}(n\sqrt{a_i})\) 的,无法通过。(不过好像可以 BSGS?
考虑优化:首先可以先将 \(\sqrt[3]{a_i}\) 内的质因数先除掉,这样是可以实现的。
那么剩下的数就一定是一下几种形式:\(p^2\),\(pq\) 和 \(p\)。
首先考虑剩下的是 \(p^2\),那么直接开根就行。
如果剩下的是 \(pq\),那么想要与它凑成完全立方数就只能含有 \(p^2q^2\),但 \(p,q\) 都是大于 \(3000\) 的整数
,所以 \(pq>10^10\),直接将答案加一,不要放进 \(map\)。
剩下 \(p\) 同理。
那么这样我们就以 \(\operatorname{O}(n\sqrt[3]{n})\) 解决了这道题。
PS:为了防止类似 abs((__int128)x) 之类的悲剧发生,这边建议手写 \(\log V\) 的开根。(虽然这题没有涉及 __int128,但有精度问题的函数少用)。
Minimum Sum of Maximums P
首先考虑把这个奇怪的贡献拆一下,可以拆成:\(\sum_{i=1}^{n-1}{\frac{a_i+a_{i+1}+|a_i-a_{i+1}|}{2}}\)。
为了避免一些奇怪的边界,我们在序列左右插入一个极大值,最后减去即可。
考虑到 \(a_i+a_{i+1}\) 是固定的,所以我们要最小化 \(\sum_{i=1}^{n-1}{|a_i-a_{i+1}|}\)。
设区间左边那个固定点值为 \(x\),右边那个值为 \(y\),若 \(x\le y\),那么直接将这段数从小到大排序一定不会更劣。类似的,如果 \(x>y\),那么可以直接从大到小排,证明显然。
对于一段区间,设该区间的最大值为 \(M\),最小值为 \(m\),那么该区间的代价是:
(其中 \(L_i\) 和 \(R_i\) 是这段区间左右固定的数的值)
那么我们现在的任务就是分配每一段的最小值和最大值。
结论:对于两段编号为 \(i,j\) 的区间,这两段区间的值域要么完全包含,要么没有相交。
直接反证是比较简单的。
那么我们就可以设计状态,设 \(f_{l,r,s}\) 表示当前值域区间为 \([l,r]\),已经固定了的区间集合为 \(s\),那么有转移:
-
没有值域恰好为 \([l,r]\) 的区间:\(f_{l,r,s}=\min{f_{l+1,r,s},f_{l,r-1,s}}\)
-
将两段拼起来,设 \(len_i\) 集合为 \(i\) 的段的长度和,有:\(f_{l,r,s}=\min{f_{l,l+len_T-1,T}+f_{l+len_T,r,s-T}}\)。
-
正好有 \([l,r]\) 的区间:\(f_{l,r,s}=\min{f_{l+1,r-1,s-{x}}+Calc_x{l,r}}\),其中 \(Calc_x{l,r}\) 是第 \(x\) 段值域为 \([l,r]\) 时的代价。
这样时间复杂度是 \(\operatorname{O}(3^kn^2)\) 的,瓶颈在第二个转移。

浙公网安备 33010602011771号