NOI2026 做题记录 三
P14002 [eJOI 2025] Navigation
如果是一棵树,我们可以只用三种颜色:\(0\) 表示未被访问过,\(1\) 表示结束访问,\(2\) 表示仍在 dfs 过程中。
现在位于节点 \(u\),如果他的邻居内仍有 \(0\),就将 \(u\) 染 \(2\) 后走向那个邻居;否则将邻域内恰好有一个 \(2\),将 \(u\) 染 \(0\) 后回溯到那个 \(2\)。
当原树是仙人掌时,由于存在环,我们可能会碰到一个点 \(u\),本身是 \(2\),但是周围有超过 \(1\) 个点为 \(2\) 的情况。此时我们不知道我们应该回溯到哪个 \(2\)。此时我们引入颜色 \(3\),表示该节点正在寻找他回溯的点。
若当前点 \(u\) 没有 \(0\) 邻居且 \(2\) 邻居个数 \(=2\),说明这个点在环附近,将 \(u\) 染成 \(3\) 后走向邻接表中靠前的 \(2\) 邻居 \(v\)。
- 如果 \(v\) 周围只有 \(\le 1\) 个 \(2\) 邻居,则说明 \(v\) 就是 \(u\) 要回溯的点,我们把 \(v\) 标记为 \(3\) 后回到 \(u\),再让 \(u\) 标记为 \(1\) 后回到 \(v\) 即可。
- 否则 \(v\) 是这个环最先访问到的点,\(u\) 该访问的点在另一边,我们保持 \(v\) 颜色为 \(2\) 走向 \(u\),此时 \(u\) 自己为 \(3\) 且视野里没有别的 \(3\),那么 \(u\) 就知道自己前一步走错了,于是走向邻接表中靠后的 \(2\),这个 \(2\) 一定是 \(u\) 应该回溯的节点。
可证明这样做程序不会走超过 \(3n\) 步。
P15263 [USACO26JAN2] Circle of Cows P
考虑刻画最优解的结构,我们把匹配看作圆上的弦,则任意两条弦一定相交。如果存在两条弦不交那么我们交换两条弦的端点,短的那一条一定会变长。
考虑枚举最短的那一条弦,我们发现整个区间被分成了 \(L,R\) 两部分,两部分的点只能向对方连边,是一个二分图。每个左端点可以连边的构成一个区间,而且左右端点递增,那么我们直接贪心就对了。\(O(n^3)\)。
P15264 [USACO26JAN2] Cow Circle P
碰撞后变方向不好维护,我们把他看作两个点互相穿过对方并交换编号;更进一步地,在模 \(n\) 意义下我们可以把碰撞的过程,看作右边的点编号 \(-1\),左边的点编号 \(+1\)。那么我们枚举最后编号成为 \(1\) 的点 \(x\),令他的初始方向为右,要求穿过他的方向为左的点的次数为 \(1-x\pmod n\)。对于一个点 \(y\neq x\),设他和 \(x\) 的距离为 \(d\),如果 \(y\) 和 \(x\) 的方向不同的话,他们在 \(k\) 分钟内会相遇 \(\lfloor \frac{2k-d}{m} \rfloor\) 次。由于 \(d<m\),所以对于同一个 \(x\),这个柿子最多只有两种不同的取值,并且每种取值各自构成环上的一个区间,这样我们用双指针分别维护两个区间中 \(\prod (p_i+(1-p_i)x^{z})\) 和 \(\prod (p_i+(1-p_i)x^{z+1})\) 的结果即可。时间复杂度 \(O(n^2)\)。
CF1470E Strange Permutation
由于每个操作互不重叠,每个不同的操作一定对应不同的结果序列。
对字典序影响最大的肯定是第一次操作,因此我们依次确定每组询问的第 \(1,2\dots c\) 次操作在哪。
我们依次推定每个点是否作为操作区间的左端点出现。设当前推定到 \(i\),还剩下 \(c'\) 的操作代价,我们将操作区间 \([i, i+1],[i, i+2]\dots [i, i+c']\) 或不操作 \(i\) 共 \(c'+1\) 种情况按 \(p_i\) 字典序大小排序,并处理每种操作后序列后面的方案数,找到第一个前缀和大于当前序列排名 \(x\) 的向后跳即可。由于 \(c\) 很小,大部分 \(i\) 我们会选择不操作他,于是用数据结构维护我们向后第一个会操作的 \(i\)。时间复杂度 \(O(nc^2+qc\log n)\)。
CF1326F Wise Men
考虑容斥,钦定 \(s_{p_1}=1,s_{p_2}=1,\dots, s_{p_k}=1\),求方案数。
相当于有若干条链,要求每条链上面的人相邻的互相认识,求方案数。
链的顺序是不重要的,我们按链长排序,相当于 \(n\) 的拆分数。
对于一种拆分方案,\({a_1,a_2\dots a_k}\),相当于要在原图上选 \(k\) 跳条长度确定的链。dp 预处理 \(f_S\) 表示集合 \(S\) 能产生多少种不同的链,我们现在相当于要对合法的 \(S_1\dots S_K\) 记数:
- \(\forall i \in [1, k], |S_i|=a_i\)
- \(\forall i,j \in [1, k],i\neq j,S_i \cap S_j=0\)。
- 每一种这样的 \(S\) 可以获得 \(\prod f_{S_i}\) 的方案。
接下来是经典 trick:第二个限制很不好做,但注意到 \(\sum a_i=n\),所以 \(\bigcup S_i=U\) 和第二条限制是等价的。
我们把答案加上一维,记 \(g_{l, S}\) 表示长度为 \(l\),经过的点集为 \(S\) 的方案,那么答案 \(\sum [\bigcup S_i=U] \prod g_{a_i, S_i}\),FWT 转卷积为点乘即可,复杂度 \(O(2^n P(n))\)。
CF37E Trial for Chief
时间倒流,每次选择一个同色连通块,把他们操作完一次后可以让其中的每个点变成白色或黑色任意,我们的目标是把他们变成全白色。
我们一定会从一个点开始不断操作目前的最大可能连通块,感性理解,同时操作多个不如操作最大的那一个。注意到我们把每一个连通块当成一个点,并在相邻的连通块之间连边的话,设第一部操作的是 \(s\),我们会依次操作 \(s\),距离 \(s\) 为 \(1\) 的连通块,距离 \(s\) 为 \(2\) 的连通块……总操作次数就是离 \(s\) 最远的黑色连通块,bfs维护之,复杂度 \(O(n^2m^2)\)。
CF1656F Parametric MST
\(w_{ij}(t)=(a_i+t)(a_j+t)-t^2\),令 \(b_i=a_i+t\),\(b_i>0\) 的点会连 \(b_1\),\(b_i<0\) 的点会连 \(b_n\)。我们发现答案 \(ans(t)\) 是若干条直线的最小值,因此 \(y=ans(x)\) 是凸的,三分即可。\(O(n\log V)\)。
CF1864H Asterism Stream
记 \(f_i\) 表示 \(i\) 被走到的概率,\(f_i=\frac{f_{i-1}+[i\bmod 2=0]f_{i/2})}{2}\),答案为 \(\sum_{i=1}^{n-1} f_i\)。
\(f_i\) 的前驱状态很少,考虑用矩阵乘法求解。对于一个 \(i\),如果 \(i\) 是奇数,我们只需要知道 \(f_{i-1}\);如果 \(i\) 是偶数但不是 \(4\) 的倍数,我们需要知道 \(f_{i-1},f_{i/2}\),也就是 \(f_{i-1},f{(i-1)/2}\)。
以此类推,当我们推导到 \(f_i\) 时,我们需要知道 \(f_{i},f_{i/2}\dots f_{i/2^k}\) 的值,一共要在矩阵中存 \(O(\log n)\) 个变量。另外转移时的系数与 \(\operatorname{lowbit}(i)\) 有关,设矩阵 \(F_k\) 表示 \(\operatorname{lowbit}(x)=k\) 时的转移系数,则目标矩阵 \(S(n)\) 为 \(\prod_{i=0}^n F(\operatorname{lowbit}(i))\)。令设 \(G(k)=\prod_{i=0}^{2^n} F(\operatorname{lowbit}(i)),H(k)=\prod_{i=0}^{2^{(n+1)}-1} F(\operatorname{lowbit}(i))\),\(G,H\) 可以互相推导,再用类似快速幂的方法求出 \(S\) 即可。\(O(\log^4 n+T \log^3 n)\)。
CF1658F Juju and Binary String
把字符串首位相连形成一个环,由介值定理得环上一定存在一个区间满足条件,于是原序列一定存在 \(\le 2\) 的答案,判断原序列答案能否 \(=1\) 。\(O(n)\)。
P12011 【MX-X10-T7】[LSOT-4] 春开,意遥遥
我们把 \((x, y)\) 看作一个长度为 \(2\) 的序列,那么这个乘法就是一个 xor 卷积,把元素 FWT 后就变成了对应位置的点乘。令 \((x, y)\to(y+x, y-x)。\) 推点柿子可以发现转化后依然有 \((a, b)=(c, d)\iff ad=bc\),因此特判掉 \(x=0 \lor y=0\) 后,我们可以令 \(a_i=x_i/y_i\),原柿等价为 \(\prod a_i^{b_i}\) 在模 \(p\) 意义下的不同值。找到 \(p\) 的原根 \(g\) 后将所有的 \(a_i\) 取离散对数,将乘法转化为加法,不妨设 \(g^{c_i}=a_i\),则区间 \([l, r]\) 的答案为 \(\dfrac{P-1}{\gcd{(P-1, c_l,\dots, c_r)}}\)。
直接求离散对数太慢,但是实际上我们只需要知道 \(\gcd{(P-1, c_i)}\),而 \(\gcd{(P-1, c_i)}\) 等于 \(a_i\) 在模 \(P\) 意义下的阶,这个是简单的。\(O(\sqrt P+n\log^2 P)\)。
P13505 [OOI 2024] Big Persimmon
有一个朴素 dp,\(f_{l, r, i}\) 表示目前还剩 \([l, r]\) 的食物没吃,且 Alice 吃完的时间与 Bob 吃完的时间之差为 \(i\)。若 \(i\le 0\) 则轮到 Alice 吃,否则轮到 Bob 吃。这样是 \(O(n^2)\) 的。
考虑缩小状态数,对于一组 \((l, r, i)\),我们存下 \(f_{l, r, i}\) 当且仅当 \(|i|\le a_{r+1}\)。在这样的限制条件下,对于一组 \((l, r, i)\),若吃掉最左边的 \(a_l\) 则转移到 \((l+1, r, i)\),若吃掉最右边的 \(a_r\),我们二分出第一个可以转移的 \(r'\) 进行转移。
将二分的过程预处理,可以做到 \(O(n\sum w)\)。
P13242 「2.48sOI R1」你的名字
首先把 \(s_i\) 和 \(t\) 按顺序拼接,并在中间插入分格符,后缀排序,那么 \(t[l2, r2]\) 出现的位置就是一段区间。差分成两端前缀,分别做。
令 \(cnt_i\) 表示这一段区间内属于 \(s_i\) 的位置的出现次数,则答案为 \(\sum_{i=l1}^{r1} cnt_i \times \min_{j=l1}^{i} a_j\),每次修改后用单侧递归线段树维护,时间复杂度 \(O(n\log^2 n)\),空间复杂度 \(O(n \log n)\)。
代码先鸽了,有空补。
CF613E Puzzle Lover
刻画一下路径形态,我们可以把路径分成三段:
- 左边一个 u 字形
- 右边一个 u 字形
- 中间一个不断往同一个方向走
我们先固定中间的“同一方向”为右方向,往左方向的反转状态后一模一样做一遍。
定义 \(f_{x, y, k}\) 表示目前在 \((x, y)\) 走了 \(k\) 步,\((3-x, y)\) 已经被走过;\(g_{x, y, k}\) 表示目前在 \((x, y)\) 走了 \(k\) 步,且 \((3-x, y)\) 还没被走过。
预处理正着倒着的 hash 并处理所有可以走的 u 字形,转移时简单的, \(O(n^2)\)。
P3447 [POI 2006] KRY-Crystals
如果前 \(n-1\) 个数确定了,第 \(n\) 个数也确定了,我们只需要判断第 \(n\) 个数是否在 \([0, m_i]\) 的范围之内。
因此对于一个 \(k\),如果存在一个 \(i\) 使得 \(m_i\) 没有取满,那么后 \(k-1\) 位除了 \(i\) 以外的所有数可以随便选。因此从大到小枚举第一个没有取满的位 \(k\),dp 记录至少有一个位置在第 \(k\) 位没有取满,且第 \([k, mxk]\) 位异或和都为 \(0\) 的方案数即可。
P10104 [GDKOI2023 提高组] 异或图
我们发现异或为 \(C\) 和异或为 \(0\) 本质是相同的,对于一个数组 \(a\) 我们要计算无不等的限制下异或为 \(C\) 的方案数,只要计算 \(\{a+C\}\) 异或为 \(0\) 的方案数和 \(\{a+(C-1)\}\) 异或为 \(0\) 的方案数之差即可,这样这一部分就转化为了上题。
对于要求边不等的情况,考虑容斥,钦定 \((u, v)\in S\) 满足 \(b_u=b_v\),容斥系数即为 \((-1)^{|S|}\)。我们只关注 \(S\) 中的边所形成的连通块的大小奇偶性以及其中 \(a\) 的最小值,因此可以对连通块进行 dp,对于每一个连通块先用 dp 求出其容斥系数,将 \(a\) 从大到小排序后,从 \(1\) 到 \(n\) 进行连通块划分,并设 dp 数组 \(f_{S, T}\) 表示 \(S\) 中的数都已经在连同块内,且 \(T\) 中的元素为大小为奇数的连通块的最小元,枚举到 \(i\) 时,如果 \(i \notin S\),那么枚举 \(i\) 所在的连通块并转移。容易发现我们可以把 \(S,T\) 并到一起,复杂度 \(O(n3^n+n2^n\log V)\)。
CF1758F Decent Division
我们维护一个 set<pair<int, int>> 表示所有的操作区间 \([l, r]\)。
把一个 \(0\) 变成 \(1\):如果这个 \(0\) 在 set 内,我们找到 set 内的这个区间 \([l, r]\),否则新建一个区间 \([x, x]\),并不断向右吞并区间直到碰到足够多的 \(0\)。
把一个 \(1\) 变成 \(0\):我们找到包含这个 \(1\) 的区间 \([l, r]\),现在我们在解决一个类似这样的问题:给一个和为 \(-2\) 的区间 \(a_{1\dots n}\)(把 \(0\) 看做 \(-1\),我们现在相当于要找几个和为 \(0\) 的区间),我们要用常数次操作把他分割成合法的区间;求出前缀和数组,我们直接找到最后一个 \(0\) 的位置,最后一个 \(-1\) 的位置,然后以此为分界线分割出最多三个区间即可。用线段树维护之,复杂度 \(O(n\log n)\)。
CF1704F Colouring Game
当场上没有 RB 的时候,我们发现此时胜负关系和 RB 的数量有关,我们发现如果 RB 数量不相等胜负关系容易判断。否则,场上还 RB 时一定选择消除 RB,而谁先消不了 RB 谁就输了,于是我们把每个 RB 的连续段的 SG 函数都算出来,即可。
现在的要解决的问题是,如何算一段连续交替 RB 的 SG 函数,打个表发现有循环节,那么是好做的。
CF1225F Tree Factory
首先树的任意一个 dfn 序一定是一个合法的 \(id\),我们不妨加强限制,让 \(id\) 必须是一个 dfn 序,如果给出了 \(id\),我们按照 \(id\) 中的顺序依次还原到原来的父亲即可。
我们发现点 \(u\) 的操作次数和 \(u\) 前面的兄弟节点 \(v\) 子树的深度有关,那么我们把长儿子放到子树的最后,其他任意,那么操作次数就是 \(O(n)\) 量级的。
P15653 [省选联考 2026] 星图 / starmap
先求第一问,取补图并让剩下的边数尽可能少,此时我们发现当 \(k-1\equiv 0\pmod 2\) 时无法改变一个点度数的奇偶性,此时答案有下界 \(\frac{\sum d_i \bmod 2}2\);当 \(k(k-1)/2\equiv 0 \pmod 2\) 时无法改变整张图的边数奇偶性,此时答案有下界 \(m\bmod 2\)。
我们先证明当 \(d_i\bmod 2=0 \land m\bmod 2=0\) 时必然有解。注意到对于任意 \((a, b, c, d)\),取一个集合 \(A\) 满足 \(|A|=k-2\),我们依次操作 \(\{A, a, b\} \{A, b, c\} \{A, c, d\}\{A, d, a\}\),就可以反转四元环 \((a, b, c, d)\)。
- 对于 \(3\le x<y\le n\),如果 \((x, y)\) 直接存在边,那么我们进行操作 \((1, 2, x, y)\)。
- 做完 1 后,对于 \(3\le x<y\le n\),如果 \((1, x),(1, y)\) 存在边,进行操作 \((1, 2, x, y),(2, 1, x, y)\)。
如何把一张图转成可以清空的样子?
-
\(k \equiv 0 \pmod 4\)
可以改变一个点的奇偶性;无法改变总边数奇偶性。如果图有奇数条边,反转任意一条,并将答案\(-1\)。 -
\(k\equiv 1\pmod 4\)
无法改变度数奇偶性无法改变总边数奇偶性。我们把奇点两两配对,并反转他们的边。如果反转完边数为奇数,我们选择一对点 \((u, v)\),撤销 \((u, v)\) 的反转,转而反转 \((u, x), (v, x)\),\(x\) 是不同于 \((u, v)\) 的任意一个数;如果没有这样的点,直接反转 \((1, 2)(2, 3)(3,1)\) 的边/ -
\(k\equiv 2\pmod 4\)
无需任何操作。 -
\(k\equiv 3 \pmod 4\)
无法改变度数的奇偶性;将奇点两两配对即可。
我们完成这些操作后,图一定可以被清空;此时如果图总共有奇数条边那么我们随便进行一次操作,如果有奇点我们将他们两两匹配并消空,最后套用四元环的做法即可。
但注意到这样的操作次数可能大于 \(\frac {n(n-1)}2\),于是每次用不超过 \(n-1\) 次操作把 \(n\) 删空,然后递归直到 \(n=k+2\),此时本质不同的操作最多只有 \(\frac {n(n-1)}2\) 种,于是满足了条件,复杂度 $ O(n^2k)$。

浙公网安备 33010602011771号