E
答案显然单调不增,那么初始答案为 (res=n),不断判定并减小答案直到可行。判断方法:把有删除操作的地方记上 (-1),把 (p_ige n) 的地方记上 (+1),若最大的后缀和 (>0),则 (res) 可行。这些操作都可以用线段树完成
F1
把 (s) 折半,每一边有 (2^{frac{n}{2}}) 种情况,每种用朴素 (dp) (2^nn)暴力处理,然后合并,总复杂度 (O(2^{1.5n}n))
F2
大致说一下
进行容斥,设 (res_i) 为 (01) 串 (i) 的答案,先计算 (S_i=sumlimits_{j|i=j}res_j),然后再推出 (res)。(S_i) 的意思就是 (i) 为 (1) 的地方依旧必须是认识的,但为 (0) 的地方无所谓,这样转化使得限制条件变少了。然后发现,如果 (A) 和 (B) 的划分情况相同(长度为 (1,2,3dots) 的连续 (1) 段数量均相同),则 (S_A=S_B)。那么只要计算 (P(n)) 种情况即可。设划分成了 (m) 段,长度为 (l_1,l_2,l_3dots),也就是要在原图中找到 (m) 条不相交的长度为 (l_1+1,l_2+1dots) 的链(长度为 (L) 的连接了 (L+1) 个人)。“不相交”可以转化为总共有 (n) 个人。先求出 (f_{i,j}) 表示走到 (i),走过的集合为 (j) 的方案数,由此可以得出 (g_{i,j}) 表示走了 (i) 步,走过的集合为 (j) 的方案数,然后对 (g_{i,*}) 来一下 (fwt),计算 (t_j=prod g_{l_i+1,j}),把 (t) 变换回来,(t_{2^n-1}) 就是答案。
但是常数大了就过不了,很多题解的代码也过不了,应该是 (CF) 的评测机变慢了。