【题解】Solution Set - NOIP2024集训Day83 dp

【题解】Solution Set - NOIP2024集训Day83 dp

https://www.becoder.com.cn/contest/5801


「清华集训2016」Alice 和 Bob 又在玩游戏

(FAKE

对每棵树,考虑一个最 naive 的 dp。

\(f_{i}\):对 \(i\) 的子树而言,先手是否必胜。

枚举先手的第一步,看后手在剩下的子树中必胜的是否为偶数个,如果是则必胜。

最终合并若干个树的答案是类似的。

10min

不对,没有这么简单,后手还可以有很多可能赢的策略。


https://www.luogu.com.cn/article/lckb7fzi

可以转化为有向图上游戏,然后应用 SG 函数

具体的,每次操作后仍是一个森林,于是将个森林看作一个局面,i.e. 有向图游戏中的点。

而一个森林中,分别对每棵子树操作是不会相互影响的,所一个局面(森林)的 SG 值就是所有树的 SG 值的异或和。

感觉 0-1 trie 完全可以用线段树来理解,包括:合并啊,懒标啊,还有查询 mex(相当于线段树上二分)



「SDOI2009」学校食堂

\((a\operatorname{or} b)-(a\operatorname{ans} b)=a\oplus b\)

(FAKE

考虑区间 dp。

\(f(l,r,a,b)\)\(l-1\) 的口味值是 \(a\)\(r+1\) 的口味是 \(b\),做完 \([l,r+1]\) 内的菜的最少时间。特别的 \(a=0\) 时,忽略 \(l\) 的时间;\(b=0\) 时忽略 \(r+1\) 的时间。

答案即:\(f(1,n,0,0)\)

我们容易拿到每个人最多能够提前到的位置。这个些位置的数量是 \(O(b)\) 的。

直接枚举 \(i\) 插队到谁的前面,有转移:

\[f(l,r,a,b)=\min_{i}(f(l,i-1,a,t_r)+f(i,r-1,t_r,b)) \]

注意到对于同一个 \(r\)\(a,b,l\) 可能的取值都是 \(O(b)\) 的,精细实现可以做到 \(O(nb^4)\)

30min

错了,因为转移的时候枚举 \(i\) 会插入到前面的哪个位置之后,分成了两个完全独立的部分,实际上是不能的。


(其实吧,虽然这个 \(b\) 很小很小,但是我觉得大指数的 \(\text{ploy}(b)\) 也不失为一种合理的尝试吧。

\(f(i,s,j)\):前 \(i-1\) 个已经在 \(i\) 前面,\(i\) 往后(含)已经在 \(i\) 前面的情况为 \(s\),最后的位置在 \(j\)

\(s\) 包含 \(i\) 是因为 \(i\) 的菜是否做好了是两种不同的转移,且都是必要的。

统计答案直接枚举最后一个人在哪。

转移是容易的。

posted @ 2024-11-21 08:46  CloudWings  阅读(5)  评论(0编辑  收藏  举报