前言
省流:300 分。
T1
考虑 DP,设f(i,0/1/2) 表示处理到第i 个数,当前是往左,不动,往右,方案是否合法,转移如下:
f[i][0]f[i][1]f[i][2]=f[i−1][0]⋅[xi−xi−1=1]+f[i−1][1]⋅[xi−(xi−1−1)=1]+f[i−1][2]⋅[xi−(xi−1+1)=1],=f[i−1][0]⋅[xi−1−xi−1=1]+f[i−1][1]⋅[xi−1−(xi−1−1)=1]+f[i−1][2]⋅[xi−1−(xi−1+1)=1],=f[i−1][0]⋅[xi+1−xi−1=1]+f[i−1][1]⋅[xi+1−(xi−1−1)=1]+f[i−1][2]⋅[xi+1−(xi−1+1)=1],
O(n)。
O(1) 做法:直接判断an−a1≤n+1 即可。
T2
原题 CF1824B2 LuoTianyi and the Floating Islands (Hard Version) - 洛谷
T3
四元环计数,考虑和三元环计数一样,先度数小的往度数大的定向。
不难发现只有三种情况:
- A -> B -> C -> D
- A -> B -> D -> C
- A -> D -> B -> C
考虑固定A,让后我们对于后面三个进行暴力枚举,不难发现后面三个相当于在枚举三元环,时间复杂度是O(mm)。
有必要澄清一点的是,loj 的提交是因为我根本不知道样例合法性,有好心人说样例有误我也只能自己猜样例这样改应该是对的,不算分。
T4
一眼n 极大m,k 极小,考虑矩阵快速幂。
先把 DP 设出来,由于k 极小可以直接在状态内部表示我们恐怖的奴隶主的类型,设f(i,cnt1,cnt2,cnt3) 表示目前打到第i 轮,恐怖的奴隶主剩一滴血的数量为cnt1,两滴血的为cnt2,三滴血的为cnt3,的扣减 Boss 的生命值点数的期望。先写出打 4 种怪的概率:
- 打 Boss:p0=cnt1+cnt2+cnt3+11。
- 打一滴血的:p1=cnt1+cnt2+cnt3+1cnt1。
- 打两滴血的:p2=cnt1+cnt2+cnt3+1cnt2。
- 打三滴血的:p3=cnt1+cnt2+cnt3+1cnt3。
那么转移如下,令nowf=f(i,cnt1,cnt2,cnt3):
f(i+1,cnt1,cnt2,cnt3)←nowf+p0
f(i+1,cnt1−1,cnt2,cnt3)f(i+1,cnt1+1,cnt2−1,cnt3+1)f(i+1,cnt1+1,cnt2−1,cnt3)f(i+1,cnt1,cnt2+1,cnt3)f(i+1,cnt1,cnt2+1,cnt3−1)←nowf⋅p1←nowf⋅p2←nowf⋅p2←nowf⋅p3←nowf⋅p3(cnt1=0)(cnt1+cnt2+cnt3≤k)(cnt1+cnt2+cnt3>k)(cnt1+cnt2+cnt3≤k)(cnt1+cnt2+cnt3>k)
时间复杂度O(nk),爆搜发现有效的状态数上界k 很小,在 170 左右,用矩阵快速幂简单优化可以做到O(Tk3logn),发现炸掉了,考虑优化。
首先向量乘法是k2 的,所以简单实现向量乘法而不是矩阵乘法容易有O(Tk2(k3logn),发现瓶颈在于每一次我们都要算一遍转移矩阵。注意到m,k 固定而n 才是变化的。所以预处理转移矩阵,通过二进制分组转移即可,时间复杂度O(k3logn+Tk2logn)。
反思:矩阵乘法实现的时候应当注意有效状态的数量以及矩阵乘法带来的n3 的大小,这个一定是要注意的。