A
排序之后只会选相邻的,直接 DP。
B
从前往后考虑每个数 \(a_i\) 要不要删。
若不删 \(a_i\):
- 若 \(a_i\ne 0\),则 \(a_i\) 已经确定。
- 若 \(a_i=0\),则 \(a_i\) 可取所有没出现过的数,以及 \(i\) 后最小的数(先删掉它再把 \(a_i\) 赋成它)
若删掉 \(a_i\):
- 若 \(a_{i+1}\ne 0\),则 \(a_i\) 会变成 \(a_{i+1}\)。
- 若 \(a_{i+1}=0\),则 \(a_{i+1}\) 可取所有没出现过的数(删除操作给 \(a_i\) 了,所以没法取 \(i+1\) 后最小的数),然后 \(a_i\) 会变成 \(a_{i+1}\)。
若不删 \(a_i\) 可以使 \(a_i\) 更小就不删,否则就删掉。
确定删掉的数之后,把没出现过的数从小到大填到空位里即可。
C
钦定 \(P_1\) 为根,则 \(i\) 的答案是 \(1\) 当且仅当 \(P\) 的前 \(i\) 个点形成的虚树恰有 \(i\) 个点。
用 set 维护虚树点集即可。
D
先设 \(g_{n,l,p}\) 表示有 \(n\) 个点,最大深度为 \(l\),有 \(p\) 个深度最大的点的无标号有根树个数。
可以用分组背包的形式转移,枚举 \(n,l,p,t\),每次加 \(t\) 个 \(g_{n,l,p}\) 内的树,有 \({g_{n,l,p}+t-1\choose t}\) 种方案(可重集组合数)。
对于 \(k\) 是偶数,钦定直径中点为根,则最大深度为 \(k/2\),每两个属于根的不同子树的、深度都为 \(k/2\) 的叶子可以产生一个直径。
再设 \(f_{n,p,d}\) 表示有 \(n\) 个点,有 \(p\) 个深度为 \(k/2\) 的叶子,有 \(d\) 个直径的无标号有根树个数,
转移同理,枚举 \(n,p,t\),每次加 \(t\) 个大小为 \(n\),有 \(p\) 个深度为 \(k/2\) 的叶子的子树(通过 \(g\) 得到方案数)即可。
对于 \(k\) 是奇数,在直径中边上加一个点,钦定这个点为根,
则根恰有两个子树,直径个数为两个子树中深度为 \(\left\lceil\dfrac k2\right\rceil\) 的叶子个数之积。
枚举两个子树的大小,深度为 \(\left\lceil\dfrac k2\right\rceil\) 的叶子个数,统计答案即可。
标签:子树,个点,删掉,个数,2024,深度,第六次,CSP,不删 From: https://www.cnblogs.com/5k-sync-closer/p/18438204