杂题小记(2023.02.25)

更好的阅读体验戳此进入

PJudge-21739 A. 【NOIP Round #5】青鱼和序列

题面

给定初始序列,存在两种操作,将序列复制并接在前面,将序列复制并翻转并接在前面,需要在 m 次操作后最大化:

i=1nj=1iajmod(1×109+7)

Solution

“容易” 发现翻转多次与翻转一次等效,“容易” 发现一次的翻转在任意位置都等效,于是模拟跑一下即可。

复杂度最优可以优化到 O(n+logm),本题限制十分宽松故写的很丑也没事。

Code

Pjudge-21743 B. 【NOIP Round #5】青鱼和怪兽

题面

存在怪兽,你有 n 点血怪兽有 m,每次可以选择攻击,会有 p 的概率使怪兽掉一滴血,反之则有 1p 的概率使自己掉一滴血吗,会消耗 1 单位时间,也可以选择 remake,不消耗时间但会使你和怪兽恢复为初始的血量,求击杀怪兽的期望时间。

Solution

考虑一个朴素的 DP,令 dp(i,j) 表示你剩 i 怪兽剩 j 的状态时击杀的期望时间,不考虑 remake 的转移为 dp(i,j)=dp(i1,j)×(1p)+dp(i,j1)×p,然后考虑到 remake,不难想到二分答案 tim,也就是二分一个 dp(n,m),此时我们不难发现边界,对于 dp(i,0),此时已经结束,赋值为 0,对于 dp(0,j) 则只能重开,赋值为 tim,然后转移过程中在朴素转移的基础上对 timmin,即如果正常的期望不如重开,那么就直接重开。然后最终判断求得得 dp(n,m) 与我们二分出来的 tim 是否相同,相同则说明不合法,可以上调下界,反之一定有更优的低于 tim 的时间,下调上界。

Code

LG-P4097 [HEOI2013]Segment

题面

插线段,求点对应最大值且序号最小的线段。

Solution

李超线段树模板解决。

Code

LG-P5249 [LnOI2019]加特林轮盘赌

题面

存在加特林,存在 n 个人围城一圈轮流使用加特林并每次均有 P 的概率被打死,求第 k 个人是最终唯一的幸存者的概率。

Solution

很有意思的一道题,和一般的朴素概率 DP 不尽相同。

前面的思路和其它题解差不多,主要细说一下最后推式子的步骤。

对于 n=1 平凡解决,对于 n=2 考虑,发现不能用一般的线性递推的思路,不难想到对于处于第一位的人,若其没有被打死,那么下一次的时候枪指向下一个人,局面与初始时原来处于第一位的人处于第二位等效,那么不难想到我们令 dp(2,i) 表示 2 个人时处于第 i 位的人幸存的概率,不难发现转移:

dp(2,1)=P×0+(1P)×dp(2,2)

也就是说考虑其原本处于第 1 位,被打死则无贡献,没有被打死并且在下一次被移动到 2 位置后仍然幸存即为答案。

写到这就不难发现这东西是存在后效性的,或者说不存在初值,但是仍然存在显然的 dp(2,1)+dp(2,2)=1,所以也可以计算。

于是考虑扩展到 dp(n,i),不难想到最朴素地:

dp(n,1)=(1P)×dp(n,n)
i=1ndp(n,i)=1

此时我们仔细想一下刚才的过程,不难发现意义就是我们每次只崩首位的人,崩完之后不移动枪,而是将整个圆排列对应旋转。

然后我们考虑对于中间的转移,不难想到对于 dp(n,k),我们如果 P 的概率崩掉首位了,则 kk1,nn1,即 P×dp(n1,k1),如果 1P 地没崩掉,那么人虽然没有减少但是圆排列仍然需要转一下 kk1,也就是 (1P)×dp(n,k1),于是转移即为:

dp(n,k)=P×dp(n1,k1)+(1P)×dp(n,k1)

当然我们这东西是没有初值的,不能直接递推,但是共存在 n 个方程,可以直接解 n1 次方程组,用高斯消元即可,但是这个是 O(n4) 的,考虑优化。

考虑对于 P×dp(n1,k1) 此时已经为常量了,令其为 ξ,则有:

dp(n,k)=(1P)×dp(n,k1)+ξ

f(k)=dp(n,k),令 ξ(k) 表示 dp(n1,k1)×P×(1P)k1,则有:

f(k)=(1P)k1f(1)+i=1k1ξ(i)

这样我们可以用 f(1) 表示出所有 f(k),然后带入 f(k)=1 求出 f(1),再 O(n) 求出所有的 f(k)

注意需要特判 P=0 的情况,且注意需要滚动数组优化空间。

最终时间复杂度 O(n2),空间复杂度 O(n)

Code

UPD

update-2023_02_25 初稿