标签:签到 数组排序 sum strong 集合 选择 xxx class inline
签到题
比较激动,纷纷WA了一发。
h复制给a,然后对a数组排序。h和a数组,求前缀和,有多少个位置满足\(\sum a[i] = \sum h[i]\), 就最多能分成多少块。符合xxx限定条件的图的计数问题。数据范围很状压。
我们用dp[mask][root]表示,集合mask里的点,以root为根,不违背限定条件的方案数。
接下来考虑dp[mask][root]是怎样转移而来的。
设x为集合mask - {root}中最小的元素。
枚举包含元素x的mask的子集newmask作为root的一棵子树。
然后我们可以在newmask中选择一个根newroot.
接下来我们判断,枚举的newmask,newroot是否合法。
对于一条已知的边。
u!=root,v!=root,如果u在newmask中,v不在newmask中,则不合法。root相连的,且在newmask中的点,至多只有一个【root最多只能和newmask中的一个点相连】。如果恰有一个,那么这个点就是newroot, 如果没有,那我们就枚举newroot。对于一组已知的LCAlca(a,b)=c
c=root,a,b都在newmask中,不合法。c在newmask中,a,b有一个不在newmask中就GG了。因为这样的话,c在newmask对应的子树里面,a,b至少有一个在newmask子树外面。对于合法的newroot,newmask
\(dp[mask][root] = \sum dp[newmask][newroot]*dp[mask-newmask][root]\)
标签:签到 数组排序 sum strong 集合 选择 xxx class inline
原文地址:https://www.cnblogs.com/RUSH-D-CAT/p/9736154.html