A. 公园
长度放不进状态,那就把遍历的点的个数放进状态,使长度最小。
然后就变成了DAG上最短路问题。
设个源点汇点,直接拓扑排序就完了。
B. 计划
设$mn(i)$表示左端点选i,最小的愉快的旅行。
显然$mn(i)$是单调的,单调指针扫过去就完了。
然后对询问枚举左端点等差数列求和,就做到了$O(qn)$。
将n个点分成$sqrt n$个块,处理出每个块到每个点的答案,这个可以递推。
大块直接走分块,小的部分暴力,复杂度就变成了$O(nsqrt n)$
C. 抽卡
考试时打的状压,将每个点拆为了3个点,结果3个点的位置放错了。
我将3个点的位置设为了i-1,2*(i-1),3*(i-1),显然是错的,应设为i-1,n+i-1,n+n+i-1。
正解也一定是状压,但拆为3个点是冗余的,我们只关心已有了几个颜色。
并且,正解将已经抽了几次卡设进了状态,
也就不用预处理每次氪金的概率数组,两层枚举状态。
设$dp(st,i)$表示当前状态用四进制表示为st,这次氪金已经抽了i次卡。
每次考虑单次抽卡比较简单,如果已经有了抽到的卡,考虑一下转移到自己的下一步 和 转移到其它状态的概率就可以了。
如果这次氪金已经抽完卡,$dp(st,m)=dp(st,0)+1$。
然而难点在于:
每次都转移到自己的下一步,这个转移会出环。
高斯消元是可行的,但是复杂度$O(4^n*m^3)$,过不去。
然而本题的环比较简单,一定只有一个包含所有变量的大环。
直接手动模拟高斯消元就可以了。
也就是说,设$dp(st,i)=a_i*dp(st,m)+b_i$。
$dp(st,i)=c_i*dp(st,i+1)+d_i$,
则有$dp(st,i)=c_i*a_{i+1}*dp(st,m)+d_i+c_i*b_{i+1}$,
所以a,b数组是可以递推的。
最终得到$dp(st,0)=a_0*dp(st,m)+b_0$
且$dp(st,m)=dp(st,0)+1$
联立解得$dp(st,m)$,回代就完了。