赛时交错代码喜提 \texttt{0pts} ,虽然赛后再交一遍也只有44pts就是了
感觉我自己想的分讨不是一般的复杂,改天有空补点简单做法吧/cy
首先看到题面这么复杂,还是个计数题,这种时候就应该把题目的限制用数学语言描述清楚。
首先大概看一眼,对于计数对象有两个限制:非降和下面那一坨柿子,然后对于序列计数,不妨试试依赖于特殊元素计数,比如这题中我就使用了最小的元素 u=b_1 ,也就是要枚举的东西。
形式化上面两个限制,注意到所谓子树中所有结点在原树中的深度值去重后组成一个集合其实是一个区间 [d_u,h_u] ,h_u 为 u 子树内深度最大值。
非降: \forall v \in b,d_v\geq d_u (只是必要条件,但足够了
设 T 为分裂后含根子树
一坨:
- 保证区间完全覆盖 u :
- \exist v \in T,h_v\geq h_u
- \forall v \in b,d_v\leq d_u,h_u\leq h_v
- 保证 u 的上下界被取到:
- (\exist v\in b,d_v=d_u)\wedge((\exist v\in b,h_v=h_u)\vee(\max_{v\in T}h_v=h_u))
放到一起:
\left\{
\begin{aligned}
&\forall v \in b,d_v\geq d_u\\
&\exist v \in T,h_v\geq h_u\\
&\forall v \in b,d_v\leq d_u,h_u\leq h_v\\
&(\exist v\in b,d_v=d_u)\wedge((\exist v\in b,h_v=h_u)\vee(\max_{v\in T}h_v=h_u))
\end{aligned}
\right.
一三可以合并:
\left\{
\begin{aligned}
&\exist v \in T,h_v\geq h_u\\
&\forall v \in b,d_v=d_u,h_u\leq h_v\\
&(\exist v\in b,d_v=d_u)\wedge((\exist v\in b,h_v=h_u)\vee(\max_{v\in T}h_v=h_u))
\end{aligned}
\right.
那么此时三的前一段没用
\left\{
\begin{aligned}
&\exist v \in T,h_v\geq h_u\\
&\forall v \in b,d_v=d_u,h_u\leq h_v\\
&(\exist v\in b,h_v=h_u)\vee(\max_{v\in T}h_v=h_u)
\end{aligned}
\right.
二的话已经很明显提示分层考虑了,不妨设深度为 x 的点的集合为 w_{x} ,令 b 为 w_{d_u} 的子集。
\left\{
\begin{aligned}
&\forall v \in b,h_u\leq h_v\\
&\exist v \in w_{d_u}\backslash b,h_v\geq h_u\\
&(\exist v\in b,h_v=h_u)\vee(\max_{v\in w_{d_u}\backslash b}h_v=h_u)
\end{aligned}
\right.
到这可以说人话了,在一层中:
- 被选的都要 h_v\geq h_u
- 没被选的至少有一个 h_v\geq h_u
- 要么被选的有一个 h_v=h_u,要么没被选的最大值 =h_u
接下来就是分类计数了,对第三个条件容斥,考虑对每一层分一段段颜色处理,假设当前颜色段左端点为 p ,右端点为 j-1 。
- 被选的有一个 h_v=h_u :
- 能选的不足 k 个,|w_{d_u}|-p\leq k :0
- 否则 |w_{d_u}|-p > k :(j-p)(k-1)!(\sum_{cnt}\tbinom{j-p-1}{cnt}\tbinom{|w_{d_u}|-j}{k-cnt-1}), 1\leq cnt\leq j-p-1 且 0\leq k-cnt-1\leq |w_{d_u}|-j
- 没被选的最大值 =h_u :(j-p)(k-1)!\tbinom{j-p-1}{j-p-1-(|w_{d_u}|-p-k)},1\leq |w_{d_u}|-p-k\leq j-p-1
- 被选的有一个 h_v=h_u 且 没被选的最大值 =h_u : (j-p)(k-1)!\tbinom{j-p-1}{j-p-1-(|w_{d_u}|-p-k)},1\leq j-p-1-(|w_{d_u}|-p-k)