摸底考试 #3
T1 摆花

题解
诈骗题
取最小的 \(r_i-l_i+1\) 即可
时间复杂度 \(O(m)\)
T2 打饭

【数据范围】
\(n \leq 3 \times 10^5,k \leq \min(n-1,5 \times 10^3),-10^9 \leq a_i \leq 10^9\)
题解
线性DP好题
可以发现问题等价于将原序列分成 \(k\) 组,其中 \(n\%k\) 组中分别有 \(n/k+1\) 个数(第一类 ),别的 \(k-n%k\) 组分别有 \(n/k\) 个数(第二类),即 \(j,k+j,2k+j…\left \lfloor n/k\right \rfloor \times k+j\)(或者 \((n/k-1)*k+j\))
答案就是每个组中的最大值 \(-\) 最小值,而为了使差值最小,答案必须是连续的一段子序列,可以考虑DP
状态设计:设 \(dp_{i,j}\) 表示第一类的组已经分了 \(i\) 个,而第二类的组分了 \(j\) 个
状态转移:
记 \(n1=n\%k,n2=k-n\%k,l1=n/k+1,l2=n/k\)
则有两种转移:
-
\(dp_{i+1,j}=\min(dp_{i+1,j},dp_{i,j}+A_{(i+1)*l1+j*l2}-A_{i*l1+j*l2+1})[i<n1]\)
-
\(dp_{i,j+1}=\min(dp_{i,j+1},dp_{i,j}+A_{i*l1+(j+1)*l2}-A_{i*l1+j*l2+1})[j<n2]\)
答案即 \(dp_{n1,n2}\)
时间复杂度 \(O(\left \lfloor \frac{n}{k} \right \rfloor\times k)\)
T3 小象砍树

【数据范围】
\(n \leq 10^5\)
题解
树形DP好题
首先考虑根节点 \(x\) 怎么求
设根节点有 \(cnt\) 棵子树,可以发现 \(y_1\) 的贡献是从剩下的 \(siz_x-1\) 个空位中选择 \(siz_{y1}\) 个位置删去子树 \(y1\) 的可能情况,即 \(C_{siz_x-1}^{siz_{y1}}\times dp_{y1}\) ,而对于第二棵子树 \(y2\) 来说,其贡献还要多减去一个 \(y1\) ( \(y1\) 已选),故贡献为 \(C_{siz_x-1-siz_{y1}}^{siz_y2}\times dp_{y2}\) ,以此类推求出 \(cnt\) 棵子树贡献
化简式子后即可得到 \(dp_x=\frac{(siz_x-1)!}{\prod_{i=1}^{cnt}siz_{y_i}}\times \prod_{i=1}^{cnt}dp_{y_i}\)
然后考虑如何换根
设当前求解的子树为 \(x\) ,\(f^{'}_x\) 表示不考虑 \(x\) 的一棵子树的方案数, \(f_x\) 为换根后的方案数
则 \(f^{'}_x=\frac{dp_x}{dp_y}\times siz_y!~\times \frac{(siz_x-1)!}{(siz_x-1-siz_y)!}\) (除掉多算的贡献)
\(f_x=dp_y \times f^{'}_x \times \frac{n!}{(siz_y-1)! \times (n-siz_y)!}\) (乘上少算的贡献)
时间复杂度 \(O(n)\)

浙公网安备 33010602011771号