[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 \times cntl + win_1 \times n \times cntw\) .

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

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

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

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

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

那么怎么 DP 呢?

\(dp_{i,x(x>0)} = \sum\limits_{y=0}^n dp_{i+1,y} \times fl_y\)

\(dp_{i,0}=\sum\limits_{y=0}^n dp_{i+1,y} \times 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(n\log n+\log D)\) 细节非常多.

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

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

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

posted @ 2020-08-31 18:57  srf  阅读(406)  评论(0编辑  收藏  举报