CF1608F MEX counting
Links
题解:
- 首先显然考虑 DP ,设计状态:有一维显然是 \(i\),然后 \(k\) 表示当前的 mex 值 ,最后 \(j\) 表示已经选的数中 \(>k\) 的数的个数。
- 然后就是很神仙的转移,考虑从 \(i\) 转移到 \(i+1\)。
- 如果加入 \(a_i\) 对 mex 不产生贡献,即 \(a_i \neq k\) ,则有 \(f_{i,j,k} \times k \rightarrow f_{i+1,j,k}\)(在 \([1,k]\) 中选择 \(a_i\)), \(f_{i,j,k} \times j \rightarrow f_{i+1,j,k}\)(在 \(j\) 个数中选择 \(a_i\)),\(f_{i,j,k} \rightarrow f_{i+1,j+1,k}\) (选择了一个 \(>k\) 且没有出现过的数)。
- 如果加入 \(a_i\) 对 mex 产生了贡献,即 \(a_i = k\),那么考虑枚举 \(k \rightarrow t\),\([k,t-1]\) 之间的数必须全部出现,转移则为 \(f_{i,j,k} \times \frac{j!}{{(j-(t-k+1))!}}\),相当于在 \(j\) 个数中选出 \(t-k+1\) 个数且要求有序。
- 然年这样的复杂度是 \(O(n^2k^2)\) 的,瓶颈在于第二种转移。
- 那么现在考虑优化,首先改主动转移为被动转移,然后令 \(T=j+k\),设状态为 \(f_{i,T,k}\),那么第二种转移就变为了 \(\sum\limits_{k < t} \frac{(j-k)!}{(j+1-t)!} \times f_{i,j,k} \rightarrow f_{i+1,j+1,t}\),然后这个可以前缀和优化,空间可以滚动数组,最后总复杂度为 \(O(n^2k)\),常数很大,需要卡常。
总结: 关键在于状态的设计以及 \(j+k\) 的发现。
Codechef DESTRUCT
Links
题解:
- 一次操作分为两个人显然不太可做,于是考虑改成这个样子: B 先选一个堆,然后 A、B 轮流拿石子和给对方选堆。
- 然后一个经典的考虑博弈论的手法是:如果当前必败,考虑能不能让对方接下来把自己的活干完。
- 然后就很神奇:如果当前 \(a_i>1\) ,拿完必败的话,就拿剩 1 个,再选这个给对方,这样对方就陷入了自己刚才的处境;否则自己拿完。也就是说,第一个拿到 \(a_i > 1\) 的堆的人必胜(全为 1 特判即可)。
- 所以一开始每个人肯定强迫对方拿 1,判断奇偶性即可。