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)\),那么朴素的递推式也不难得到:

\[f_i = \sum_{j = 1}^i{(f_{j - 1} \times (i - j)! + f_{i - j} \times (j - 1)!) \times C_{i - 1}^{j - 1}} + \sum_{j = 2}^{i - 1}{(g_{i - j} \times (j - 1)! + j(j - 1)!(i - j)! - g_{j - 1} \times (i - j) !) \times C_{i - 1}^{j - 1}} \]

其中第一部分为左右子树的贡献,第二部分为根节点两个儿子的贡献。

对递推式进一步化简可以得到:

\[f_i = 2 \sum_{j = 1}^i{C_{i - 1}^{j - 1} \times (j - 1)! \times f_{i - j}} + \sum_{j = 2}^{i - 1}j \times (j - 1)! \times (i - j)! \times C_{i - 1}^{j - 1} \]

两边同时除以 \((i - 1)!\) 得:

\[\frac{f_i}{(i - 1)!} = 2 \sum_{j = 1}^i{\frac{f_{j - 1}}{(j - 1)!}} + \sum_{j = 2}^{i - 1}{j} \text{ = } 2 \sum_{j = 1}^i{\frac{f_{j - 1}}{(j - 1)!}} + \frac{(i + 1)(i - 1)}{2} \]

\(h_i = \frac{f_i}{i!}\),替换得:

\[h_i = \begin{cases} 0, & i\leq 3 \\[2ex] \frac{2 \sum \limits_{j = 1}^{i - 1}{h_j} + \frac{(i + 1)(i - 1)}{2}}{i}, & i > 3 \\[2ex] \end{cases} \]

十分显然地可以用前缀和将求 \(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\),此时没有贡献

​ 用树状数组可以简单维护,注意同一子树中的路径可能会算入答案,对每棵子树单独做一遍减去即可。

posted @ 2020-11-18 16:00  buzzhou  阅读(67)  评论(0)    收藏  举报