标签:更新 位置 bin 顺序 通过 序列 mes 拓扑图 先后
题意实际上是让你求拓扑序数。
引用 \(\text{shaowice1984}\) 学长的一句话:“这题要是想拓扑图就凉了。”
我们可以先忽略边的限制直接建树,然后跑树形dp。
子树内的点对顺序到lca处统计贡献。
我们设 \(f[i][j]\) 表示 \(i\) 这个点处于拓扑序第 \(j\) 位的方案数。
那么对于 \(u\) 的子树 \(v\),如果 \(v\) 能放到 \(u\) 的前面,那么对 \(f[u][i+j]\) 的贡献有:
其中 \(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