[Record] 杂题选做-省选
现在属于是彻底凭兴趣随机刷题了(乐)。
CF2164F1 Chain Prefix Rank (Easy Version)
Easy Version 是水题,Hard Version 我不会(乱胡的平衡树做法假了……)。
考虑只有一条链的情况,显然给定 \(a\) 数组后,所有点的重标号是唯一确定的。进一步地,考虑一条从根节点到叶子的链,链上所有点的相对顺序也是唯一确定的。
树形 dp 进行二叉合并 \(u,v\) 时,根据以上分析,将 \(u,v\) 的公共祖先链上的所有点按照规则有唯一的重排列 \(p\) ,此时 \(u,v\) 子树内部的每个点要么插入 \(p\) 的开头结尾,要么插入 \(p\) 序列相邻两个元素的空隙中,且任意一个点插入到 \(p\) 序列的位置是唯一确定的。
因为子树内部所有点的相对顺序已经确定,因此设 \(a,b\) 分别为 \(u,v\) 子树内插入某个空隙中的数量,则二叉合并的方案数为:
对子树内某个点会插入到哪个空隙的计算是可以随便乱做的。
P11714 [清华集训 2014] 主旋律
甚至是寒假的题。
强连通的情形不容易刻画,考虑正难则反,计算非强连通图的数量,也即缩点后形成点数大于 \(1\) 的 DAG 的方案数量。
唉我服了, DAG 生成子图计数的推导鬼知道我写了几回笔记了,假定看到这篇博客的人和一年后滚回来复健的我都会,反正至少我现在会。简而言之是考虑拓扑序第一层进行超集反演。
设 \(dp_S\) 为 \(S\) 所为一个 SCC 的方案数计数,先列一个式子:
按照惯例这里正常应该使用艾弗森括号展开之类的方法开始推 \(\Delta(S,T)\) 了,但这里有一个巧妙的方法,我们修改 \(g_T\) 的定义为缩成奇数个点的方案数减去缩成偶数个点的方案数,此时 \(g\) 的定义自带容斥,令 \(\Delta(S,T)=1\) 即可。
然后找到子结构进行转移,抓一个特定的点(如 \(\text{lowbit}/\text{highbit}\)),钦定它所处的 SCC 是新加入的,因此:
如果对 \(E\) 的预处理足够优美,整个问题可以做到 \(O(3^n)\)。

浙公网安备 33010602011771号