[CEOI2020 D1T3 / CF1402C] 星际迷航Star Trek 题解

我的CEOI作战记录&题解-洛谷博客

我的CEOI作战记录&题解-cnblogs

题目链接-luogu 题目链接-Codeforces

首先思考 (D=1) 怎么做.

不难发现,如果一个时空隧道指向了一个必胜点,那么这个时空隧道相当于不存在;否则相当于强制把这一层的某个点 (x) 变为了必胜点.

换根 DP 求出 (cnt_x) 表示能使 (x) 胜负状态改变的强制把这一层的某个点 (y) 变为了必胜点的操作种数.

原树上的必胜点数目为 (cntw) ,必败点数目为 (cntl) ,记 (win_x) 表示原树上 (x) 是否必胜,是则为 (1) ,否则为 (0) .

那么对于 (D=1) ,答案就是 (cnt_1 imes cntl + win_1 imes n imes cntw) .

(fw_i) 为 把 (i) 强制变为必胜点之后的必胜点数目,特别的,令 (fw_0=cntw) . 记 (sumcntw)(sumlimits_{i=1}^n fw_i)

(fl_i) 为 把(i)强制变为必胜点之后的必败点数目(,)特别的(,)(fl_0=cntl) . 记 (sumcntl)(sumlimits_{i=1}^n fl_i)

对于 (D>1) 的情况(,)首先我们考虑 (dp_{i,x(1leq xleq n)}) 表示第(i)层的时空隧道连接了下一层的必败点(,)并使得(x)强制变为必胜点的方案数.

再记一个 (dp_{i,0}) 表示示第 (i) 层的时空隧道连接了下一层的必胜点的方案数.

如果我们能计算出这些东西(,)那么答案就是 (sumlimits_{i=0}^n dp_{1,i} imes (cnt_1 imes fl_i+win_1 imes n imes fw_i))

那么怎么 DP 呢?

(dp_{i,x(x>0)} = sumlimits_{y=0}^n dp_{i+1,y} imes fl_y)

(dp_{i,0}=sumlimits_{y=0}^n dp_{i+1,y} imes fw_y)

不难发现所有的 (dp_{i,1},dp_{i,2},...,dp_{i,n}) 都相等,所以对于每个 (i) 我们只需要记两个 DP 值.

并且转移可以写成矩阵形式,而且无论是转移还是计算答案我们都不需要求出 (fl_i)(fw_i) ,只需要求出它们的和 (sumcntw) , (sumcntl) . 这两个数可以通过上述的换根 DP 结果求出.

复杂度 (O(n+log D))(O(nlog n+log D)) 细节非常多.

(O(n + log D)) 代码 :见云剪贴板

注意实现时的空间!!!注意实现时的空间!!!注意实现时的空间!!!

不建议使用vector存图/map存DP结果.

原文地址:https://www.cnblogs.com/s-r-f/p/13591178.html