【题解】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\) 插队到谁的前面,有转移:
注意到对于同一个 \(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\) 的菜是否做好了是两种不同的转移,且都是必要的。
统计答案直接枚举最后一个人在哪。
转移是容易的。