做题笔记(AtCoder)

比赛补题

ABC 350

C 题最开始因为一个变量在操作间不经意被修改吃了一发罚时,后怀疑自己方法有误,联想到了之前做过的一道排序题,敲完之后上交发现还是 WA 了。回到最开始的代码,检查了一下,发现了错误。虽然题目过了,但还是浪费了很多时间。或许不应该对自己的方法过早产生质疑。

F 题是一个非常经典的递归题(括号序列),这道题预计时间只有 30 min,却做了 60min 还没有做出来,剩下的题也没有时间开了。做这道题是只想到了常见的递归思路,并没有想到可以使用栈预处理每个区间的大小。

这次对 E 题的难度评估也出了问题,初次看到 E 以为是自己非常不熟悉的概率论,果断跳过,赛后看题解才发现是一道记忆化搜索配上了一点数学。没有想到预期成本其实就是成本的平均数。

杂题选做

DPO Matching

定义一个集合 $S$ ,其中包含了所有的妹子,令 $F(S)$ 代表 $S$ 和前 $|S|$ 个男生匹配的结果,若 $S = \empty$ ,易得 $D(S) = 1$ 。因为 $n$ 的范围非常小,考虑直接进行枚举 $S$ 来求得答案。

状态转移方程 $D(S) = \sum_{x \in S} D(S - x)$ 。

时间复杂度 $O(n2^n)$ 。

通过二进制状态压缩是枚举一个人选不选的常用思路。

AC code

DPT Permutation

定义 $F(i, j)$ 序列 $1$ 到 $i$ 以第 $j$ 大为结尾的方案数,显然 $F(1, 1) = 1$。

对于 $j < i$ 如果 $S_{i - 2} =$ MARKDOWN_HASH58ba3bb1a1772a74392e5e86bd2be4b7MARKDOWNHASH ,则有 $F(i, j) = \sum{j < k \le i} D(i - 1, k - 1)$ ,这是由于 $[1, i )$ 全排列和 $[1, j - 1]\cup[j + 1, i]$ 是等价的,这不废话?
如果 $S_{i - 2} = $MARKDOWN_HASH87acb03b9542ddbc824f5bbd080a5cd4MARKDOWNHASH ,直接令 $D(i, j ) = \sum{1 \le k \le j}D(i - 1, k)$ 。

这种题每次都挺玄学的???每次都是想一半,这也更加说明了动态规划基本上是含一个索引,接着是会影响下一次选择的状态。

AC code

DPV Subtree

定义 $F(i)$ 代表将 $i$ 强制染色,以 $i$ 为根的子树的方案数,$D(i)$ 代表子树外的方案数,最终答案为 $D(i) \times F(i)$。

经过简单推理可得:

$$F(x) = \prod F(to)+1$$

其中 $to$ 为 $x$ 的子节点。$F(to)$ 是子节点 $to$ 染成黑色的方案数,而 $+1$ 是将 $to$ 染成白色的方案数。

但是 $D$ 的推理就有一些麻烦了,公式如下:

$$D(x) = (D(fa) \times \prod F(v) + 1) + 1$$

其中 $fa$ 为 $x$ 的父节点,而 $v$ 为 $x$ 的兄弟节点。后面的 $+1$ 是将 $fa$ 染成白色的方案数,而 $F(v)+1$ 是将兄弟节点染成黑色和白色的方案数总和,将其乘上 $D(fa)$ 也就是指,将 $fa$ 染成黑色的方案数。

很显然,如果每次枚举都要计算一次 $\prod F(x) + 1$ ,时间复杂度是 $O(n ^ 2)$ 的,由于 $F(x) + 1$ 的值是恒定且不变的,此时有理由想到使用前缀后缀和优化。

此时的时间复杂度为 $O(n)$。

DPY Grid 2

正难则反,若 $H \times W$ 的网格中没有障碍物,那么从 $(1, 1)$ 走到 $(H, W)$ 的方案数为 $\binom{H + W - 2}{H - 1}$ 。这是因为每次我们都可以做决策是向右还是向下,若我们选择了 $H - 1$ 次向下走(向右),那其余的选择一定能够确定。

为了方便表示,定义 $A(x1, y1, x2, y2) = \binom{x2 - x1 + y2 - y1}{x2 - x1}$。

考虑如何求 $(x1, y1)$ 到 $(x2, y2)$ 的方案数。若他们中间并没有障碍物,则方案数为 $A(x1, y1, x2, y2)$,若他们中间有一个障碍物 $(x0, y0)$,从 $(x1, y1)$ 到 $(x0, y0)$, 的方案数为 $A(x1, y1, x0, y0)$,从 $(x0, y0)$ 到 $(x2, y2)$ 的方案数为 $A(x0, y0, x2, y2)$,而从 $(x1, y1)$ 在经过 $(x0, y0)$ 的情况下,到达 $(x2, y2)$ 的方案数为 $A(x1, y1, x0, y0) \times A(x0, y0, x2, y2) $,用总方案数减去经过 $(x0, y0)$ 的方案数即是题目所求的内容。

定义 $D(i)$ 为:从 $(1, 1)$ 不经过其他障碍物达到第 $i$ 个障碍物的方案数,若我们把点 $(H, W)$ 当作第 $n + 1$ 个障碍物,则最终的答案为 $D(n + 1)$。我们将所有障碍物按照坐标递增排序,当我们计算到第 $i$ 个障碍物时,$D(i) = A(1, 1, xi, yi) - \sum_{j = 1}^{j < i} D(j) \times A(xj, yj, xi, yi)$ 。

AC code

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇