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)\),瓶颈在优先队列上。

QOJ15303. Basic Counting Practice Problems

定义 \(f_{u, i, j}\) 表示目前处于 \(u\),子树 \(u\) 内填了 \(1\dots siz_u\),只能走权值 \(\le i\) 的点走了 \(j\) 个点的方案数,转移是 \(O(n^4)\) 的,记 \(F_{u, i}(x)=\sum_j f_{u, i, j} x^j\),利用拉格朗日插值优化,我们记录 \(g_{u, i, j}=F_{u, i}(j)\),记录 \(n+1\) 个点值来做到 \(O(n^3)\) 的转移,但将 \(g\) 还原成 \(f\) 仍需要 \(O(n^4)\) 的复杂度。

考虑如何统计答案,我们用 \(f_{u, i, j} \times {{i-1}\choose{k-1}}\times {{siz_u-i}\choose{n-k}} \times q_j\to ans_{u, k}\),我们发现对于固定的 \(i,k\)\(f_{u, i, j}\) 对答案的贡献是一个线性变换,而 \(g_{u, i, j}\)\(f_{u, i, k}\) 的形式也为一个线性变换。因此我们可以直接预处理出每个 \(g_{*, i, j}\)\(ans_{*,k}\) 的贡献系数,以此省去点值转系数的过程,做到 \(O(n^3)\)。代码待补。

QOJ15318. Flower's land 3

题意等价于给定 \(n\) 个长度为 \(m\)\(01\)\(s_i\),对于每个 \(i\),需要求出有多少个 \(j<i\) 满足 \(\operatorname{popcount}(s_i \oplus s_j)\le k\)\(k \le 3\),且保证至少有一个 \(j\) 满足条件,要求做到 \(O(nmk)\) 的复杂度。

单纯记数 \(\sum_{j<i} (\operatorname{popcount}(s_i\oplus s_j)\le k)\) 是难的,但题目还保证了对于每个 \(i\) 都存在这样的 \(j\),于是我们考虑用 \(j\) 的答案直接推出 \(i\) 的答案。记 \(f_i\) 表示任意一个满足条件的 \(j\),时时刻刻维护 \(f_i\) 形成的树,当我们知道任意一个节点 \(u, s_u\oplus s_i\) 的值后,对于 \(u\) 的任意一个孩子 \(v\),我们直接枚举 \(s_u\)\(s_v\) 不同的位置(不超过 \(k\) 个),以此来得到 \(v\) 的答案。

CF698F Coprime Permutation

link

进行一些合理猜测。

  1. 质因子集合相同的数可以任意互换:显然 \(\gcd(i, j)\)\(1\) 的关系只与质因子集合有关。
  2. 对于质数 \(x,y\) 而言,如果 \(\lfloor \frac{n}{x}\rfloor=\lfloor \frac n y \rfloor\),我们可以将 \(x,y\) 的倍数整体互换。

我们通过打表,可以发现上面两个条件就是充分必要的。

CF1299D Around the World

link

翻译一下题意,我们可以删掉一些与 \(1\) 相连的边,删掉后,包含 \(1\) 的连通块内,不存在一个简单环的集合,满足这个集合的异或和为 \(0\)

先删掉 \(1\),对于每个连通块,如果这个连通块是线性有关的,那么这个连通块必须和 \(1\) 断开。否则可以和 \(1\) 连接,但是要求所有与 \(1\) 相连的连通块的所有简单环都是线性无关的。我们发现把把本题值域很小,一一因此考虑把所有简单环插入线性基内,对不同的线性基 DP 即可,复杂度 \(O((n+B)B)\),其中 \(B\) 为不同的线性基个数,在本题 \(V\le 31\) 的条件下 \(B=374\)

CF1554E You

link

结论:每一种给 \(n-1\) 条边定向的方案与 \(a_u\) 的方案构成双射。

证明:我们考虑证明定向后每个节点的度数 \(deg_u\),和 \(a_u\) 的定义等价,于是考虑证明不同的定向方向一定能产生不同的 \(deg_u\)。对于一个叶子节点 \(u\),他与父亲的链边决定了的 \(deg_u\);在确定叶子节点后我们把他删掉,不断迭代即可得到定向方案。

由此可以产生推论,\(\sum a_u=n-1\);总方案数为 \(2^{n-1}\)

如果 \(k>1\),可以直接唯一确定定向方案,我们对于可能有答案的 \(k,k>1\)(即满足 \(k|n-1\)) 单独跑一遍暴力,剩下的所有方案都满足 \(k=1\)。本题最大的难点在构造双射。\(O(nd)\),其中 \(d\)\(n-1\) 的因子个数,可以通过一些分析做到 \(O(n\omega)\)\(\omega\)\(n-1\) 的质因子个数。

CF1852E Rivalries

link

对于所有的 \(a_i=x\),只有最左边的位置 \(l\) 和最右边的位置 \(r\) 是有用的,我们把每个数抽象成一个三元组 \((l, r, x)\)

对于 \(x<y\),如果有 \(x\)\([l, r]\) 包含 \(y\)\([l', r']\),那么 \((l, r, x)\) 也是没有用的。去掉这些三元组后,每个三元组都会成为某些区间的权重,因此这些区间不能改变。对于一个保存下来的 \((l, r, x)\) 一定有 \(ans_l=ans_r=x\)

另外还没有填的 \(i\),令 \(b_i\) 为包含 \(i\) 的最大的 \((l, r, x)\),我们显然可以让 \(ans_i=b_i\)。我们也可以让一些数填没有出现过的数 \(y\),只要让最后 \((y, l, r)\) 完全被某一个 \(x\) 偏序即可。

容易发现我们最多只会填一个没有出现过的数。枚举偏序的元组 \((y, l, r)\),则 \(x\)\(<y\) 的最大的没有出现过的数,我们把所有 \(b_i>x\)\(ans_i\) 变成 \(b_i\)\(b_i<x\)\(ans_i\) 变成 \(x\)。另外如果这样填,填完之后 \((x, l, r)\) 并没有被 \((y, l', r')\) 偏序的话,我们还要在 \([1, l'-1]\)\([r'+1, n]\) 选一个代价最小的数,把他变成 \(x\)

以上操作容易用线段树维护,时间复杂度 \(O(n\log n)\)

CF1267H Help BerLine

link

首先选一些位置为 \(1\),我们要保证这些 \(1\) 互不相邻。我们发现如果满足这个条件,并且删去所有 \(1\) 之后,剩下的序列也满足条件,那么加上这些点也一定是合法的。

归纳证明,加上一些 \(1\) 之后,倘若一个区间包含 \(>1\)\(1\),那么删掉这些 \(1\) 后这个区间肯定还有其他颜色。由于我们已经证明了上一层的子问题,所以当前区间也符合要求。

考虑如何选择尽可能多的 \(1\) 在任意时可不相邻。考虑贪心,按时间从后往前枚举点,如果他没被标记就把他选上,并且把出现时间在他之前的点标记。每选择一个点,我们最多标记两个点,因此至少可以选择 \(\lfloor \frac n 3 \rfloor\)\(1\),颜色总数是 \(\log_{\frac 3 2} n\) 规模的。

CF2096F Wonderful Impostors

link

考虑求出所有的 \(p_r\) 表示最小的 \(l\) 满足 \([l, r]\) 是合法区间,用双指针求出这个数组。

当前合法的区间为 \([l, r]\),我们现在尝试加入 \(r+1\)

  • 加入一个语句 \(1\):判断 \([vl, vr]\) 是否至少有一个点没有被语句 \(0\) 覆盖。
  • 加入一个语句 \(0\):判断之前有没有语句 \(1\) \(x\) 因为这个语句而全部被覆盖。如果存在这样的 \(x\)\(x\) 肯定与 \(r+1\) 有交,那么找到加上 \(r+1\)\(r+1\) 左右两端第一个没有覆盖的点 \(vl,vr\),那么 \(x\) 一定被 \((vl, vr)\) 包含,判断有没有这样的 \(x\) 即可。

如果可以加入 \(r+1\),那我们直接加入;若不能,删掉 \(l\) 后接着判断。时间复杂度 \(O(n\log n)\)

CF2097E Clearing the Snowdrift

link

由于只会减最大值,考虑把所有最大值用一些操作减小到次大值,再将所有次大值减小到第三大值……

每次要用尽可能少的线段覆盖所有的最大值,令初始 \(p=1\),若 \(p\) 不是当前最大值 \(p\gets p+1\);否则我们覆盖 \([p, p+d-1]\),再令 \(p\gets p+d\)。我们需要维护一个数据结构,将一个点改为当前最大值,并查询从 \(p=1\)\(d\) 边的次数,用 LCT 解决,复杂度 \(O(n\log n)\)

CF2066E Tropical Season

link

初始时我们要找到一对质量相等的桶,对他们进行比较后,可以获得所有 \(2k\) 的自由水量,记为 \(L\)。之后我们可以选择让一个 \(a_i\le L\),令 \(L\gets L+a_i\);或者选择 \(a_i,a_j>L,|a_i-a_j|\le L\),并让 \(L\gets L+a_i+a_j\)。我们发现这个过程可以直接暴力跳,操作的次数不会超过 \(O(\log V)\) 次。

证明:如果吞并了比自己小的水桶,如果下一次还能吃且吃了 \(x\),那么有 \(x>L\),两次操作内 \(L\) 至少翻倍;如果 \(L\) 这一次吞了两个比他更大的,那么 \(L\) 直接变成原来的至少三倍。

用喜欢的数据结构维护,复杂度 \(O(q\log^2 V)\)

CF2119F Volcanic Eruptions

link

当前点与岩浆的距离不会增大。我们只需要保证终点合法即可。

当跳到一对相邻的 \(11\) 之后,我们可以无限延长路径。我们至多只会跳一对相邻的 \(11\)

考虑解的形态。枚举最后的终点 \(t\),我们在 \(st\to t\) 的路径上可能会选择走出路径跳一对 \(11\) 再走回来,在这之前的所有路径要求 \(-1,1\) 交错,这样把解分成了三个结构。预处理每个点出发到 \(11\) 对的最短路径,再从 \(st\) 开始 dfs,容易 \(O(n)\) 求出答案。

CF2127F Hamed and AghaBalaSar

link

转化题意,我们把一个 \(a\) 分成尽可能多段,每一段的结尾都是 \(a_n\),贡献即为每一段的结尾-开头值之和。

\(S(n, m, k)\) 表示 \(n\) 个变量 \(a_1\dots a_n\) 满足 \(a_i\in [0, k]\land \sum a_i=m\) 的合法的 \(a\) 的方案数。

枚举 \(a_n=k\)

  1. 每一段尾 \(i\) 的贡献,这里每出现一个结尾就会有 \(k\) 的贡献:
  1. \(i=n\),方案数为 \(S(n-1, m-k, k)\)
  2. \(i\neq n\),方案数 \(S(n-2, m-k-k, k)\)
  1. 每一段开头的贡献:
  1. \(i=1\),要求 \(a_n=k\),此时每个数是平等的,\(a_1\) 的期望即 \(\frac {m-k}{n-1}\),方案有 \(S(n-1, m-k, k)\)
  2. \(i\in [2, n-1]\),要求 \(a_{i-1}=a_n=k\)\(a_i\) 的期望 \(\frac {m-k-k}{n-2}\),方案数为 \(S(n-2, m-k-k, k)\)
  3. \(i=n\),此时要求 \(a_{n-1}=a_n=k\),方案数 \(S(n-2, m-k-k, k)\),期望即为 \(k\)

复杂度是调和级数 \(O(m\log m)\)

CF2034H Rayan vs. Rayaneh

link

等价于找到一个集合 \(S\),满足 \(\forall x \in S,\gcd_{(y\in S \setminus x)} y \nmid x\)

对每个 \(x\in S\) 分解质因子,条件可以看成,对于每个 \(x\),满足存在质数 \(p\),满足 \(p\)\(x\) 中的次幂是严格最小的。

反过来思考,设 \(C=p_1^{r_1}\times p_2^{r_2}\times\dots\times p_k^{r_k}\)\(f_x\)\(a\)\(x\) 的倍数个数,如果有 \(\forall i \in [1, k], f_{C/{p_i^{r_i}}}<f_C\),那么我们就能找到一组 \(k\) 个数的解。

这里显然要求 \(C/{p_i^{r_i}}\le V=10^5\),如果 \(k\ge 3\),我们有最小的 \(p_i^{r_i}\le \sqrt V\),那么 \(C\) 的个数不超过 \(V\sqrt V\) 个,可以直接暴搜枚举。\(k=2\) 时我们要找到一组 \(a_i,a_j\) 满足 \(a_i \nmid a_j \land a_j\nmid a_i\),对于每个 \(i\) 判定一下是否所有的 \(a_j>a_i\)\(a_j\) 都是 \(a_i\) 的倍数。

本题较为卡常,需要给暴搜加上减枝才可通过。

CF1799H Tree Cutting

link

考虑枚举最终仍存在的点 \(rt\),以 \(rt\) 为根将树定向,则对于一条边 \((u, fa_u)\),如果我们选择在第 \(k\) 步中删掉它,肯定删掉 \(u\) 的子树,此时要求 \(u\) 子树内剩余的点数为 \(s_{k-1}-s_k\)

考虑换根 dp,\(f_{u, S}\) 表示 \(u\) 子树内编号在集合 \(S\) 内的操作都已经完成的方案数。从儿子转移到父亲就是子集卷积,转移完后我们再考虑 \((u, fa_u)\) 是否被删去。如果被删去,删掉 \((u, fa_u)\) 的操作编号一定是 \(\max{S}\),且保证 \(S\) 中删掉的点数之和为 \(siz_u\)

对于一种方案,在最终被保留的 \(s_k\) 个节点中均会被算到一次,因此我们把换根 dp 得到的答案除以 \(s_k\) 就是真正的答案,复杂度 \(O(n3^k)\)\(O(nk2^k)\)

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