(CSP2019模拟)DTOJ 4624. 树

题意

给定一棵 n n n 个结点的树,共有 q q q 次询问。

i i i 次询问首先包含了三个数 k i , m i , r i k_i,m_i,r_i ki,mi,ri ,接着给定了树上互不相同的 k i k_i ki 个关键点 a i , 1 , a i , 2 , … , a i , k a_{i, 1}, a_{i, 2}, \dots, a_{i, k} ai,1,ai,2,,ai,k 。对于第
i i i次询问,你需要回答当这棵树以 r i r_i ri 为根时,你有多少种方案将这 k i k_i ki 个点分为至多 m i m_i mi 组,使得同一组内的任意两个不同的结点都不存在祖先关系。

对于第 i i i 次询问,假设你一共将 k i k_i ki 个点分成了 p p p 组,那么分组的方案需要满足:

  • 给出的 k i k_i ki 个点中每个点属于且仅属于 p p p 组中的其中一组。
  • p p p 组中的任意一组都要至少包含一个结点。

对于第 i i i 次询问,两个分组的方案不同,当且仅当它们分出的组数不同,或者存在两个点 a i , x , a i , y ( x ≠ y ) a_{i, x}, a_{i, y}(x \neq y) ai,x,ai,y(x=y) ,它
们在其中一种分组方案中被分到了同一组,在另一种分组方案中没有被分到同一组。
数据范围:
对于 20% 的数据, n ≤ 10 , ∑ k i ≤ 20 , m i ≤ min ⁡ ( 4 , k i ) n \leq 10, \sum k_{i} \leq 20, m_{i} \leq \min \left(4, k_{i}\right) n10,ki20,mimin(4,ki)

对于 60% 的数据, n ≤ 1 0 4 , ∑ k i ≤ 1 0 4 , m i ≤ min ⁡ ( 50 , k i ) n \leq 10^{4}, \sum k_{i} \leq 10^{4}, m_{i} \leq \min \left(50, k_{i}\right) n104,ki104,mimin(50,ki)

对于另外 20% 的数据,保证第 i i i 条边是 ( 1 , i + 1 ) (1,i+1) (1,i+1) ,并且对于每个询问 r i = 1 r_i=1 ri=1

对于 100% 的数据, n ≤ 1 0 5 , q ≤ 1 0 5 , ∑ k i ≤ 1 0 5 , 1 ≤ u , v ≤ n n \leq 10^{5}, q \leq 10^{5}, \sum k_{i} \leq 10^{5}, 1 \leq u, v \leq n n105,q105,ki105,1u,vn

对于每个询问, 1 ≤ k i , r i ≤ n , 1 ≤ m i ≤ min ⁡ ( 300 , k i ) 1 \leq k_{i}, r_{i} \leq n, 1 \leq m_{i} \leq \min \left(300, k_{i}\right) 1ki,rin,1mimin(300,ki)

题解

考场:
只会直观的DP,记 f [ i ] [ j ] f[i][j] f[i][j] i i i子树内分成 j j j组的方案数,转移时枚举、容斥一下,但效率是 O ( n × m 2 ) O(n\times m^{2}) O(n×m2)的,就算用虚树优化也过不了,于是只拿了60的暴力。
正解:
若直接在树上做,难以避免枚举子树分成几组,转移时效率不优秀。
故考虑能否每次只加入一个点。发现若按照一定顺序一个个加入点,记 f [ i ] [ j ] f[i][j] f[i][j]为前 i i i个分为 j j j组,则每次转移为 f [ i ] [ j ] = f [ i − 1 ] [ j − 1 ] + f [ i ] [ j − 1 ] × x f[i][j]=f[i-1][j-1]+f[i][j-1]\times x f[i][j]=f[i1][j1]+f[i][j1]×x,十分优秀。考虑 x x x怎么算,对于不能有祖先关系,只考虑后代不能放到祖先的集合,即每个点加入时,不能放到有它的祖先的集合,而此时它的祖先已全都加入,且一定在不同集合内,于是直接减去祖先个数即可。而对于加入点的顺序,考虑若在一颗树上,则按照深度顺序,那么对于一个根和一些关键点,即为它到根的路径上关键点的个数,整个过程用树状数组维护即可。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值