码迷,mamicode.com
首页 > 其他好文 > 详细

有趣计数题选做

时间:2020-11-01 20:58:18      阅读:14      评论:0      收藏:0      [点我收藏+]

标签:更新   位置   bin   顺序   通过   序列   mes   拓扑图   先后   

1.[HEOI2013]SAO

题意实际上是让你求拓扑序数。

引用 \(\text{shaowice1984}\) 学长的一句话:“这题要是想拓扑图就凉了。”

我们可以先忽略边的限制直接建树,然后跑树形dp。

子树内的点对顺序到lca处统计贡献。

我们设 \(f[i][j]\) 表示 \(i\) 这个点处于拓扑序第 \(j\) 位的方案数。

那么对于 \(u\) 的子树 \(v\),如果 \(v\) 能放到 \(u\) 的前面,那么对 \(f[u][i+j]\) 的贡献有:

\[f[u][i]\times \binom{i-1}{j+i-1}\times \binom{siz_u -i}{siz_u+siz_v-j-i}\times \sum_{k}f[v][k] \]

其中 \(v\in son_u\),我们枚举了 \(v\) 的子树有 \(j\) 个在 \(u\) 的前面。

那么更新后 \(u\) 前面的点有 \(i+j-1\) 个,我们选出了 \(i-1\) 属于 \(u\),那么这 \(i-1\) 个点排在 \(u\) 前面的方案是\(f[u][i]\)

同理 \(u\) 的后面有 \(siz_u -i\) 个数。

那么我们可以通过限定 \(k\) 的范围来控制先后顺序,把 \(u\) 放在前面等价于 \(k\in[j+1,siz_v]\),我选的 \(k\) 在序列中一定大于 \(i+j-i\) 的位置。

同理,\(u\) 在后面就一定保证在小于等于 \(i+j-i\) 的位置。

发现最后一项可以前缀(后缀)和优化,复杂度 \(O(n^2)\)

有趣计数题选做

标签:更新   位置   bin   顺序   通过   序列   mes   拓扑图   先后   

原文地址:https://www.cnblogs.com/Alansp/p/13848244.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!