HNOI 2015 解题报告

HNOI 2015 解题报告

By Tuifei_oier

完成了 2015 年的 6 题后,决定写一篇解题报告记录一下各个题的做法和值得积累的 tricks。

按我心情排序。

这一年总体上考察两个方面:DP (x3) 与 数据结构 (x2)。

T1 开店

考察点:点分树。

首先构建出点分树,对每个点用数据结构维护管辖区域内所有点到自己以及点分树父亲的距离(年龄作为下标)。

比较模板的点分树,偏考察知识点。

T2 菜肴制作

考察点:拓扑排序、贪心。

为了满足所求序列应在合法的前提下字典序尽可能小的要求,转化为建反图求字典序最大的拓扑序,这种简单的贪心变换可以积累一下。

T3 接水果

考察点:整体二分+扫描线

考虑怎么计算包含关系,不难发现就是两种情况:

  1. 给定路径的端点没有祖先关系,则包含它的路径一定满足:端点分别在给定路径端点的两个子树内。
  2. 给定路径的端点有祖先关系,则包含它的路径一定满足:端点一个在下端点子树内,一个在上端点其他子树中。

如果把点拍到 dfs 序上去,两种情况可以被表述为:

  1. 给定路径端点 (a,b),则:(L_ale L_ule R_a,L_ble L_vle R_b)
  2. (L_ble L_vle R_b,1le L_u<L_c)(L_ble L_vle R_b,R_c<L_ule n)

其中,(c)(a) 的儿子且 (b)(c) 子树中。

两种情况都是一个矩形的形式,相当于修改矩形内所有的询问点。
考虑对所有询问整体二分,每次用扫描线处理所有矩形和询问即可。

T4 亚瑟王

考察点:DP+期望/概率

首先考虑求每张牌的期望伤害,即每张牌的发动概率。

然后,对于求每张牌的发动概率,由于对于第 (i) 张牌,每一轮中一旦使用了 ([1,i-1]) 中任意一张牌后都不会考虑第 (i) 张牌,因此我们需要 DP 来考虑这个问题。
关键的状态在于前面的牌中发动了几张牌,因此我们设 (dp_{i,j}) 表示前 (i) 张牌在所有的 (r) 轮中有 (j) 张被发动过的概率,不难推出转移方程。
考虑再用这个求出每张牌被发动的概率,就解决了这个问题。

T5 实验比较

考察点:DP+组合计数

首先给定的图实际上构成森林,拓扑排序判无解即可。
接下来考虑每个连通块的答案,用树形 DP 来统计。
由于等号的存在,考虑设 (dp_{i,j}) 表示以 (i) 为根的子树最终构成的序列中有 (j-1) 个小于号的方案数。
考虑背包转移,列出转移方程为 (dp_{x,i}gets dp_{x,j} imes dp_{y,k} imes inom{i-1}{j-1}inom{j-1}{j+k-i})
合并时,看成是先考虑 (dp_{x,j}) 中去除掉 (x) 后剩余的 (j-1) 段在 (dp_{x,i}) 中去除掉 (x) 后的 (i-1) 段中的位置,即 (inom{i-1}{j-1}),再考虑把 (dp_{y,k}) 中的剩余部分与其合并。

T6 落忆枫音

考察点:DAG+DP

考虑 DAG 的外向生成树计数,相当于对于每个点选择一个父亲,于是答案即为 (prodlimits_{i=2}^nin_i),其中 (in_i)(i) 的入度。

考虑加入一条边后发生了什么:我们直接用上面的式子计算可能会恰好选择一个环上所有点的父亲都为它在环上的前驱的情况,考虑减掉这些不合法的情况。
相当于对于一个环 (a_1,a_2,...,a_k) 我们先钦定每个点的父亲就为它在环上的前驱,其他点父亲随便选,即:

[f_x=dfrac{prodlimits_{i=2}^n in_i}{prodlimits_{i=1}^kin_{a_i}} ]

不难发现这样不会算重也不会漏算,则答案为 (prodlimits_{i=2}^nin_i-sum f_x)

显然不应该对每个环算一次 (f_x),由于所有环都是因为边 (s-t) 产生的,因此我们只需考虑从 (t-s) 的每一条路径并计算这条路径上的 (f_x) 值的和,建反图后 DAG 上 DP 即可。


总体上说,这一年的考点重复性还是比较高的,特别是 DP 与拓扑序多次出现,在之后的几年里就鲜有这种情况了。而从题目难度来说,也没有近几年的题难度大,比较适合练习与提升,学习一些经典的套路和技巧。

原文地址:https://www.cnblogs.com/tuifei-oiers-home/p/14270287.html