CF1794E
我们现在考虑换根 dp,维护每个点为根的深度集合。
考虑哈希,我们令深度为 \(d\) 的点贡献是 \(base^d\)。
那么,\(f_u=1+\sum f_v\times base\)。换根时容易的。
由于题目给的是大小为 \(n-1\) 的集合,我们判断两个集合哈希值的差是否是 \(base\) 的幂即可。
CF1799G
考虑容斥,设钦定了 \(i\) 个点不合法的方案数是 \(F_i\),\(Ans=\sum_{i=0}^n(-1)^iF_i\)。
考虑计算 \(f_i\),我们把每种颜色都拎出来,设 \(dp_{c,j}\) 表示第 \(c\) 种颜色取了 \(j\) 个不合法的贡献。
我们知道将 \(m\) 个数分成若干组,每组大小为 \(a\) 的方案数是 \(\dfrac{m!}{\prod a_i!}\)。
对于 \(dp_{i,j}\),我们再设 \(g_{i,j}\) 表示前 \(i\) 个数选了 \(j\) 个不合法的方案数。
转移的话枚举 \(k\) 代表第 \(i\) 个数被多少个不合法的数选了。
\(g_{i,j}=\sum g_{i-1,j-k}\times \dfrac{1}{k!(cnt_i-k)!}\)。
如果有 \(L\) 个数颜色为 \(c\)。那么 \(dp_{c,i}=g_{c,i}\times C_n^i\times i!\)。
设 \(f_{i,j}\) 表示前 \(i\) 种颜色,\(j\) 个不合法的贡献,\(f_{i,j}=\sum f_{i-1,j-k}\times dp_{i,k}\)。
\(F_i=f_{n,i}\times (n-i)!\)。
CF856D
使得加若干条边是仙人掌,那么转化为加的路径都不交。
考虑设状态 \(f_u\) 表示 \(u\) 子树的最大代价。
考虑把所有路径都放到 LCA 处去处理,现在考虑计算 \((x,y)\) 的贡献,
即 \((x,y)\) 路径上所有点的其他儿子的权值和加上这条路径的代价。
设 \(s_i=\sum_{fa_j=i} f_j\),那么这个贡献就是 \(s_u+\sum_{i\in(x,y),i\neq u} s_i-f_i\)。
这是一个链求和,单点修改的形式,不妨用树状数组。
链求和差分一下,转化为维护根到每个点的权值和,那么就是子树加。
CF1767E
转化为相邻两个颜色必须选一个,那么考虑建图出来,跑最小点覆盖。
考虑变成总代价减去最大独立集。最大独立集考虑 meet in middle,
可以先枚举前 \(m/2\) 个点选或不选,可以求出后 \(m/2\) 个点哪些是能选的,后面这些点考虑记忆化。