有趣计数题选做
Posted alansp
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有趣计数题选做相关的知识,希望对你有一定的参考价值。
1.[HEOI2013]SAO
题意实际上是让你求拓扑序数。
引用 ( ext{shaowice1984}) 学长的一句话:“这题要是想拓扑图就凉了。”
我们可以先忽略边的限制直接建树,然后跑树形dp。
子树内的点对顺序到lca处统计贡献。
我们设 (f[i][j]) 表示 (i) 这个点处于拓扑序第 (j) 位的方案数。
那么对于 (u) 的子树 (v),如果 (v) 能放到 (u) 的前面,那么对 (f[u][i+j]) 的贡献有:
[f[u][i] imes inom{i-1}{j+i-1} imes inom{siz_u -i}{siz_u+siz_v-j-i} imes sum_{k}f[v][k]
]
其中 (vin son_u),我们枚举了 (v) 的子树有 (j) 个在 (u) 的前面。
那么更新后 (u) 前面的点有 (i+j-1) 个,我们选出了 (i-1) 属于 (u),那么这 (i-1) 个点排在 (u) 前面的方案是(f[u][i])。
同理 (u) 的后面有 (siz_u -i) 个数。
那么我们可以通过限定 (k) 的范围来控制先后顺序,把 (u) 放在前面等价于 (kin[j+1,siz_v]),我选的 (k) 在序列中一定大于 (i+j-i) 的位置。
同理,(u) 在后面就一定保证在小于等于 (i+j-i) 的位置。
发现最后一项可以前缀(后缀)和优化,复杂度 (O(n^2)) 。
以上是关于有趣计数题选做的主要内容,如果未能解决你的问题,请参考以下文章