2020.11.16提高组模拟
2020.11.16【NOIP提高A组】
暴露了自己很多弱点的模拟赛,记忆化搜索不太行,递推推式子不太行,淀粉质不太行,总想用数据结构碾也不太行,不太行危。
T1. 6863食堂计划
建出最短路图,有一个 耳熟能详的 结论:最短路图是一个 \(DAG\) (拓扑图)。
那么下现在问题转化为 \(DAG\) 上从 \(S\) 到 \(T\) 互不不相交的两条路径的方案数(注意 \((S \rightarrow T, S \rightarrow T)\) 也算!!!)。
设 \(f_{i, j}\) 表示两条路径结尾为 \(i, j\) 的方案数,记忆化搜索即可 我是不会承认自己改了一下午记忆化搜索的,搜索时使 \(dis_i < dis_j \text{ or } (dis_i = dis_j \text{ & } i < j)\) 及 \(i \neq j\) 以保证两条路径不会相交。
最后注意答案要除以 \(2\),并且特判 \((S \rightarrow T, S \rightarrow T)\)。
T2. 6864笛卡尔树
考虑递推,设 \(f_i\) 表示长度为 \(i\) 的排列的权值总和,\(g_i\) 表示长度为 \(i\) 的排列所有根可能出现的位置之和。
易得 \(g_i = \sum \limits_{j = 1}^{i} j \times (i - 1) = \frac{i(i + 1)}{2} (i - 1)\),那么朴素的递推式也不难得到:
其中第一部分为左右子树的贡献,第二部分为根节点两个儿子的贡献。
对递推式进一步化简可以得到:
两边同时除以 \((i - 1)!\) 得:
令 \(h_i = \frac{f_i}{i!}\),替换得:
十分显然地可以用前缀和将求 \(h_i\) 的时间优化到 \(O(n)\)。
T3. 6865序列翻转
一道状压 \(dp\) + \(dp\) + 找规律的大型缝合题,距离 \(AC\) 还差一个 \(dp\)。
T4. 6866路径大小差
赛时想到了点分治但是却没想到排序求答案,一直在想怎么巧 \((bao)\) 妙 \((li)\) 数据结构过掉,但是失败了...... 逃
考虑怎么求出所有经过当前分治重心 \(u\) 的合法路径的数量,首先可以求出所有路径的 \(max\) 和 \(min\),根据 \(max\) 从小到大枚举,设当前枚举到第 \(i\) 条:
由于排序,所以 \(max_i\) 一定是前 \(i\) 条路径中最大的,按 \(max_i - min_i\) 分类讨论,
-
\(max_i - min_i = k\),那么贡献为 \(\sum \limits_{j = 1}^{i - 1}{[min_j \geq min_i]}\)
-
\(max_i - min_i > k\),贡献为 \(\sum \limits_{j = 1}^{i - 1}{[max_i - min_j = k]}\)
-
\(max_i - min_j < k\),此时没有贡献
用树状数组可以简单维护,注意同一子树中的路径可能会算入答案,对每棵子树单独做一遍减去即可。

浙公网安备 33010602011771号