CF926 Div.2

C. Sasha and the Casino

赌场规则:如果下注 \(y(y > 0)\) 元,如果赢了则除了 \(y\) 元外,额外获得 \(y \times (k - 1)\) 元,否则则输掉 \(y\) 元;

并且你不能连续输超过 \(x\)

最初,你有 \(a\) 枚硬币,询问是否能够赢取任意数量的硬币

题解:思维

考虑这样一种策略:假设前面一直输,保证如果当前的这局赢了,盈利将超过亏损的钱,这种叫做倍投法,这样一旦赢了,我们重新从 \(1\) 开始下注

那么我们只需要暴力跑 \(x + 1\) 次即可

注意会爆 long long

D. Sasha and a Walk in the City

image-20240218162207739

题解:树形 DP

定义 \(dp[i][0/1/2]\) 代表以 \(i\) 为根的子树中,从任意叶子出发到 \(i\) 的路径中有 \(0/1/2\) 个危险节点

\[dp[i][0] = 1 \\ dp[i][1] = \prod_{j} (dp[j][0] + dp[j][1])\\ dp[i][2] = \sum_j (dp[j][1] + dp[j][2]) \]

E. Sasha and the Happy Tree Cutting

image-20240218163118943

题解:状压 DP + 虚树思想

关键路径数量 \(k \leq 20\) 提醒我们状压

我们对于每条边 \(i\) 求出有哪些关键路径经过 \(i\),定义其为 \(S_i\)

定义 \(dp[i][mask]\) 代表在前 \(i - 1\) 条边中涂色,使得有哪些关键路径被覆盖的状态为 \(mask\)

那么转移很简单:\(dp[i + 1][mask\ | \ S_i] = \min(dp[i + 1][mask\ | \ S_i], dp[i][mask] + 1)\)

\(dp[i + 1][mask] = min(dp[i + 1][mask], dp[i][mask])\)
但是现在复杂度为 \(O(n2^k)\),但是观察后我们发现实际上只有 \(O(k)\)\(S_i\),因为我们对 \(2k\) 个关键点建虚树,虚树上的边数就是 \(S_i\) 不同的边数,即 \(O(k)\)

所以我们直接 \(O(nk)\) 处理 \(S_i\) ,然后排序后去重

然后 \(O(k2^k)\) 状压即可

注意滚动优化空间

F. Sasha and the Wedding Binary Search Tree

image-20240218164123589

题解:隔板法 + 二叉树的遍历

考虑到二叉树的中序遍历是有序的

那么我们就很多线段,并且我们也得到了每条线段中数的范围 \([l, r]\)

那么对于每条线段来说,就转化为:长度为 \(x\) 的线段,其中每个数范围在 \([l, r]\),要求使得线段中的数不递减的方案数

这是一个经典的组合数问题:我们考虑将线段中每个数看成小球,然后数的范围看成盒子,也就是 \(x\) 个相同的小球,放入 \(r - l + 1\) 个不同的盒子中,允许盒子为空的方案数,显然隔板法,即 \(C_{r - l + x}^{r - l}\)

但是 \(r - l\) 太大了,无法预处理,我们考虑换个形式 \(C_{r - l + x}^{r - l} = C_{r - l + x}^x\),我们考虑暴力计算,因为 \(\sum x = O(n)\) ,所以可以暴力

最后将每条线段的方案数的乘积作为答案即可

posted @ 2024-02-18 16:51  Zeoy_kkk  阅读(23)  评论(0编辑  收藏  举报