NOI2026 做题记录 二

P5291 [十二省联考 2019] 希望

对于一个合法方案,可到达的点集一定是一个连通块,于是考虑点减边容斥。

现在,对于每个点 \(u\),我们要对最远距离 \(u\) \(\le L\) 且包含 \(u\) 的连通块计数。

\(f_{u, x}\)\(u\) 的子树内,最远距离 \(u\) 不超过 \(x\) 的连通块的个数,\(g_{u, x}\)\(u\) 的子树外最远距离 \(u\) 不超过 \(x\) 的连通块的个数,有 \(f_{u, x}=\prod_{v\in son_u} f_{v, x-1}+1\)\(g_{u, x}=g_{fa_u,x-1}\times \prod_{v\in son_{fa_u} \setminus u} f_{v, x-2}+1\)我们对于每个点要得到 \(f_{u, L},f_{u, L-1}, g_{u, L}\) 类似的状物。

\(f_u\) 的转移是经典的长链剖分优化 dp。

关于 \(g\) ,我们也采用类似长链剖分的套路,暴力转移轻儿子,让重儿子继承答案,时间复杂度 \(O(n\log n)\),可以通过离线处理逆元的方式优化到 \(O(n\log k)\)

P5292 [HNOI2019] 校园旅行

朴素 dp 设 \(f_{u, v}\) 表示 \(u\)\(v\) 的路径是否可行,转移就是枚举 \(u\)\(v\) 的出边,复杂度 \(O((\sum deg_u)^2)=O(m^2)\),可以通过枚举中间状态优化到 \(O(nm)\) 但是没有前途。

考虑刻画回文路径的形态,我们发现在路径的中间截断,两端的 \(00\) 可以扩展成 \(0000\)\(01\) 可以扩展成 \(0101\)\(11\) 同理,我们把颜色相同或者连续相异的段和并在一起,发现只需要每一段的种类和长度的奇偶性相同即可。我们只要让每两个点之间同种类路径的奇偶可能性保持不变就行了。我们可以只保留一部分边,使得原图和新图的路径等价。具体地:

  • 对于每一个同色边的连通块,我们保留一颗生成树,如果有奇环,就随便找一个点添加一个自环
  • 对于每一个异色边的连通块,由于其一定没有奇环,只保留一颗生成树。

这样边数就降到了 \(O(n)\),总复杂度 \(O(n^2)\)

P9168 [省选联考 2023] 人员调度

构建二分图模型来判定一种方案是否合法,设 \(s_u\) 表示 \(u\) 子树内需要匹配的人员数量,一个合法匹配需要满足,\(\forall u,s_u\le siz_u\)

用线段数二分将删除转换为撤销,每次加入一个员工 \((x, k)\) 时,找到其最深的祖先 \(u\) 满足 \(siz_u=s_u\),再找到 \(u\) 子树内能力值最小的 \((x', k')\) 并将其替换。\(O(n\log^3 n)\)

QOJ15035. Lighthouse

对于一棵树,我们可以逐个子树贪心,求出每个子树至少要多少个灯塔才能满足条件,以及用最少灯塔的情况下还能向外照多远/至少需要根往下照多远。

对于一个仙人掌,建出圆方树,考虑其每一个环。这个环上有一个点是圆方树的祖先,是需要求解的值,其他的点的值已经求出。

首先,环里有一些位置可以从里往外照,我们先将满足条件的点删去,则剩下的未被照到的点,需要满足环上一个区间 \([l_i, r_i]\) 内至少要放一个灯塔。我们在一个点 \(x\) 放置灯塔后,下一个放置的位置即为 \(\min_{l_i>x} r_i\),容易 dp 转移,在单个环上可做到 \(O(len)\), 其中 \(len\) 是环的长度。

但我们刚刚的做法只考虑了环内,实际上可以让一些点被环外的灯塔照到;因此我们二分祖先方向灯塔向内照的距离,再检测环的内部,如果放置的灯塔更少那就更优。

最后复杂度是 \(O(n\log k)\) 的,听说可以去掉二分做到 \(O(n)\)

QOJ15041. Memory, Permutation, and Rooted Tree

用拓扑序刻画题目的条件:对于一个点 \(u\),对 \(d_u>dep_v-dep_u\)\(v\)\(u\)\(v\) 连边,表示 \(u\)\(v\) 之前;选择一个点 \(v\) 满足 \(d_u=dep_v-dep_u\)\(v\)\(u\) 连边。

考虑优化第一类边的建图。如果 \(u\) 的祖先 \(anc_1,anc_2...anc_k\) 均向 \(u\) 有连边,我们发现他们之间形成一个团的形式,因此我们只要让 \(u\) 最深且可以和 \(u\) 连边的祖先连边即可。

对于第二类边,我们先让所有点被锁定,等到一个点 \(v\) 从优先队列弹出后,对于所有被锁定的 \(v\) 的祖先 \(u\) 满足 \(dep_v-dep_u=d_u\),我们把 \(u\) 解锁,此时才可以把 \(u\) 加入队列中。

我们注意到解锁的 \(u\) 一定是 \(v\) 可以解锁的祖先的一段后缀,因此暴力往上跳,直到遇到第一个已经解锁的点。

复杂度 \(O(n\log n)\),瓶颈在优先队列上。

posted @ 2026-01-15 21:04  Nangu  阅读(15)  评论(0)    收藏  举报