[容斥] [dp] P5469 [NOI2019] 机器人

posted on 2025-05-06 02:52:15 | under | source

题意:\(m\) 个机器人,每个人有一张 \(n\) 个格子的纸条。格子的状态有 \(0,1\) 和空,有操作序列 \(S\)\(S_i=R\) 就向右移动一格,\(S_i=0/1\) 就将格子填为 \(0/1\)(前提是不能为空)。给每张纸条设定初始态 \(x_i\) 和终止态 \(y_i\),求是否有 \(p\) 满足将所有机器人放在 \(p\) 上执行操作,使得不越界且最终符合终止态。太简单了所以求 \(x,y\) 方案数满足上面问题有解。\(n\le 32,m\le 1000,|S_i|\le 100\)

考虑容斥,钦定若干位置合法,那么此时每张纸条每个格子的操作是确定的,不难计算它的方案,然后乘起来即可。\(O(2^nmn)\)

看到 \(n\) 的范围,应该是折半优化。注意到一个“平衡点”:\(S\) 中若有很多 \(R\),那么很多靠后的位置都是不能选的;反之,一个位置可以影响到的格子有限。不妨记 \(R\) 数量为 \(c\)

于是将容斥以 dp 的方式实现,记 \(f_{i,S}\) 为考虑前 \(i\) 个格子,位置 \([i-c,i)\) 的选取状态是 \(S\)。那么 \(S\) 状态数是 \(O(2^{\min(c,n-c)})\) 的,可以接受。

然后转移瓶颈在于求当前格子填什么,实际上可以 bitset 优化,相当于求个子集交,然后就 \(O(\frac {nm2^{\min(c,n-c)}}w)\) 了。

posted @ 2026-01-13 11:16  Zwi  阅读(1)  评论(0)    收藏  举报