codeforces Round#332Div2 题解

codeforces Round#332Div2

AB

签到题

比较激动,纷纷WA了一发。

C
  • 把数组h复制给a,然后对a数组排序。
  • ha数组,求前缀和,有多少个位置满足\(\sum a[i] = \sum h[i]\), 就最多能分成多少块。
D
  • 我们枚举更短的那条边,这样的边不会太多。
  • 然后求,更长的那条边。
E

符合xxx限定条件的图的计数问题。数据范围很状压。

我们用dp[mask][root]表示,集合mask里的点,以root为根,不违背限定条件的方案数。

接下来考虑dp[mask][root]是怎样转移而来的。

x为集合mask - {root}中最小的元素。

枚举包含元素xmask的子集newmask作为root的一棵子树。
然后我们可以在newmask中选择一个根newroot.

接下来我们判断,枚举的newmask,newroot是否合法。

对于一条已知的边。

  • u!=root,v!=root,如果unewmask中,v不在newmask中,则不合法。
  • root相连的,且在newmask中的点,至多只有一个【root最多只能和newmask中的一个点相连】。如果恰有一个,那么这个点就是newroot, 如果没有,那我们就枚举newroot

对于一组已知的LCAlca(a,b)=c

  • 如果c=root,a,b都在newmask中,不合法。
  • 如果cnewmask中,a,b有一个不在newmask中就GG了。因为这样的话,cnewmask对应的子树里面,a,b至少有一个在newmask子树外面。

对于合法的newroot,newmask

\(dp[mask][root] = \sum dp[newmask][newroot]*dp[mask-newmask][root]\)

转载于:https://www.cnblogs.com/RUSH-D-CAT/p/9736154.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值