HN省队集训2024讲课题解

题单

Nauuo and Pictures (hard version)

考虑 dp。

fid,i,j 表示对于第 id 张图片,现在进行了 i 次操作,其中 j 次是将某数加一,权值的期望值。 O(1) 转移是简单的。

这样时间复杂度是 O(nm2) 的,考虑优化。

考虑将每个照片拆成 wi 个同类的且权值为 1 的照片,那么现在照片就只有两种:ai 等于 1ai 等于 0

那么就可以将 id 那一位去掉。 设 fi,j 表示进行 i 次加一操作,j 次减一后的期望代价,有转移:

fi,j=fi1,j×i+k=1nwk[ak=1]ij+k=1nwk

fi,j=fi,j1×k=1nwk[ak=0]jij+k=1nwk

这样时间复杂度是 O(m2logm),可以通过本题,但预处理逆元可以做到 O(m2)

Anticube

首先有个想法:对每个 ai 分解质因数,然后用 map 找到与之冲突的数,取两者中间出现最多的数。

但这样是 O(nai) 的,无法通过。(不过好像可以 BSGS?

考虑优化:首先可以先将 ai3 内的质因数先除掉,这样是可以实现的。

那么剩下的数就一定是一下几种形式:p2pqp

首先考虑剩下的是 p2,那么直接开根就行。

如果剩下的是 pq,那么想要与它凑成完全立方数就只能含有 p2q2,但 p,q 都是大于 3000 的整数
,所以 pq>1010,直接将答案加一,不要放进 map

剩下 p 同理。

那么这样我们就以 O(nn3) 解决了这道题。

PS:为了防止类似 abs((__int128)x) 之类的悲剧发生,这边建议手写 logV 的开根。(虽然这题没有涉及 __int128,但有精度问题的函数少用)。

Minimum Sum of Maximums P

首先考虑把这个奇怪的贡献拆一下,可以拆成:i=1n1ai+ai+1+|aiai+1|2

为了避免一些奇怪的边界,我们在序列左右插入一个极大值,最后减去即可。

考虑到 ai+ai+1 是固定的,所以我们要最小化 i=1n1|aiai+1|

设区间左边那个固定点值为 x,右边那个值为 y,若 xy,那么直接将这段数从小到大排序一定不会更劣。类似的,如果 x>y,那么可以直接从大到小排,证明显然。

对于一段区间,设该区间的最大值为 M,最小值为 m,那么该区间的代价是:

|Lim|+Mm+|RiM|

(其中 LiRi 是这段区间左右固定的数的值)

那么我们现在的任务就是分配每一段的最小值和最大值。

结论:对于两段编号为 i,j 的区间,这两段区间的值域要么完全包含,要么没有相交。

直接反证是比较简单的。

那么我们就可以设计状态,设 fl,r,s 表示当前值域区间为 [l,r],已经固定了的区间集合为 s,那么有转移:

  1. 没有值域恰好为 [l,r] 的区间:fl,r,s=minfl+1,r,s,fl,r1,s

  2. 将两段拼起来,设 leni 集合为 i 的段的长度和,有:fl,r,s=minfl,l+lenT1,T+fl+lenT,r,sT

  3. 正好有 [l,r] 的区间:fl,r,s=minfl+1,r1,sx+Calcxl,r,其中 Calcxl,r 是第 x 段值域为 [l,r] 时的代价。

这样时间复杂度是 O(3kn2) 的,瓶颈在第二个转移。

咕咕咕

posted @   caoshurui  阅读(89)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示