专栏文章

题解:CF599E Sandy and Nuts

CF599E题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miqzvbv6
此快照首次捕获于
2025/12/04 13:27
3 个月前
此快照最后确认于
2025/12/04 13:27
3 个月前
查看原文
n13n \leq 13,显然状压。
dpu,Sdp_{u,S} 表示以 uu 为根,这个子树的点集为 SS 的方案数。显然有转移:dpu,S=TS,vEudpv,T×dpu,STdp_{u,S} = \sum \limits_{T \subseteq S,v\in E_u}dp_{v,T} \times dp_{u,S-T}。(这里的减号是差集,在实操的时候要异或)
这时候我们发现会算重。具体而言,我们会在按照不同的顺序枚举同一个子树。因此,考虑限定枚举顺序。随意取出一个异于根节点的点,钦定 TT 必须包含此节点就能解决算重的问题。
此时,我们需考虑转移的限制。
  • LCA\text{LCA} 的限制
    • 如果对于一条限制 (a,b,c)(a,b,c),满足 c=uc=ua,bTa,b \in T,显然不合法。
    • 如果对于一条限制 (a,b,c)(a,b,c),满足 cTc \in TaTbTa \notin T \lor b \notin T,显然不合法。
  • 边的限制
    • 如果有大于一条边 (a,b)(a,b),满足 a=ubTa = u \land b \in T,显然不合法。
    • 如果有一条边 (a,b)(a,b),满足 x,yuaTbTx,y \neq u \land a\in T \land b \notin T,显然不合法。
把不合法的状态剪去即可。
代码上可用记搜实现,具体地,想要获得 TT 要枚举 SS 的子集。有经典套路可做到 O(3n)O(3^n) 而不是 O(4n)O(4^n)
还要注意一点,在搜索时先把 uu 的状态从 SS 里面扣掉,这样就能避免一坨边界讨论。往下递归的时候把 uu 的状态再加进去就行了。
于是做完了,时间复杂度 O(3nn(n+m+q))O(3^n n(n+m+q))。实际上由于无用状态极多,三秒时限完全卡不满。

评论

0 条评论,欢迎与作者交流。

正在加载评论...