模拟35 题解

A. 公园

长度放不进状态,那就把遍历的点的个数放进状态,使长度最小。

然后就变成了DAG上最短路问题。

设个源点汇点,直接拓扑排序就完了。

 

 

 

B. 计划

设$mn(i)$表示左端点选i,最小的愉快的旅行。

显然$mn(i)$是单调的,单调指针扫过去就完了。

然后对询问枚举左端点等差数列求和,就做到了$O(qn)$。

将n个点分成$\sqrt n$个块,处理出每个块到每个点的答案,这个可以递推。

大块直接走分块,小的部分暴力,复杂度就变成了$O(n\sqrt 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)$,回代就完了。

posted @ 2019-09-03 11:29  skyh  阅读(215)  评论(0编辑  收藏  举报