2023.02.21 模拟赛小结

更好的阅读体验戳此进入

赛时思路

T1

给定 k 以及序列 t 个数 a1,a2,at,你需要求出最小的 k 的倍数满足其所有数字都不存在 a1,a2,,at

类似的原题是 Vijos-1065 最小数字倍数,该题要求仅存在对应数。

一道很简单但做得很麻烦的题,首先考虑的是 dp(i,j,k) 表示前 i 位最后一位为 j 然后第 ii+1 及以后的贡献为 k 对应的数,这样的时空复杂度卡的都很死,然后写转移的时候发现 j 是没有意义的,只转移合法的即可,于是去掉一维但时间复杂度不变。

转移及其复杂,需要考虑很多细节,也不知道我咋想出来的,奇奇怪怪。

Code

T2

原题 UVA1422 Processor

存在 n 个任务,每个任务有有效时间 [si,ti],任务量 wi,存在一个可变速处理器,其速度为 v 时处理对应任务的时间就是 wiv,你需要最小化最大速度使得所有任务可以在规定时间内完成。

大概想出来贪心了,左端点排序然后右端点排序建堆,但是取元素然后区间覆盖的时候一直没太想好怎么处理,主要的问题是卡在了,建树最大实际上应该是 ti 而不是 n×wi,所以直接建树的话复杂度是正确的,总之就是最后全挂了。。

Code

T3

存在初始全为白色的序列,每次从 [1,n] 随机一个 a 再随机一个 b,以 min(a,b) 作为 l,以 max(a,b) 作为 r,将区间染黑,求 k 次随机后的期望黑色点个数。

手推了一下次数为 1 的部分分,对了。搓了个假的暴力,过了一点。

Code

T4

给定序列 Anq 次询问每次给定 p,l,r 表示其在 p 想要值域在 [l,r] 中切存在于 An 中的每一种数各一个,定义贡献为物品的位置与 p 的距离,最小化贡献,对于每次询问输出最小值。

 

Code

正解

T1

考虑 modk 意义下,可以考虑 dp(i,j) 表示前 i 位模 k 意义下值为 j 的数然后进行数位 DP,这样是简单且平凡的。

还有更平凡的做法即进行 bfs,记录前驱以及具体数位值,跑一遍即可。

Code

T2

问题关键在于转换,即不去枚举事件,而去枚举时间,这样贪心更显然且极好维护。

Code

T3

考虑将问题转化为求每个点被涂黑的期望并利用线性性求和,考虑正难则反,用 1 减去不被涂黑的概率即可,显然 k 次后为:

f(x)=1((x1)2+(nx)2n2)k

暴力求解期望 80pts,考虑后者应为最高 2k+1 项的多项式,于是使用拉格朗日插值即可在 O(klogk)O(k2) 的复杂度内计算,代码略了。

T4

离线询问差分一下算点的贡献就行,奇怪题。

UPD

update-2023_02_21 初稿