NOIP 2026 长训营

NOIP 2026 长训营

Day 1

杂题

B.Concurrently Balanced Strings G

显然字符串平衡即为括号串匹配,则考虑使用前缀和刻画这个事情,设 \([l,r]\) 为合法区间,则满足:\(\forall i\in [l,r],pre_i\ge pre_{l-1}\),且有 \(pre_r = pre_{l-1}\),我们先来考虑前面的约束,显然可以预处理对于每个字符串的每一个位置,下一个小于它的位置在哪里。

而第二个限制也很好处理,可以哈希一下。这个东西有一个小 Trick 吧,就是你只需要求出对于 \(l\) 最近的一个合法位置 \(r_0\) 即可,设 \(f_i\) 表示以 \(i\) 为左端点的答案,则 \(f_i = f_{r_0 + 1} + 1\),只需要最后倒序处理即可。

D.旧词

首先考虑 \(k=1\) 的做法,这是很经典的套路,我们将 \([1,i]\) 中的所有点到根节点路径上的所有点全部加一,则答案即为 \(y\) 到根的路径之和。这道题目也可以同样的做。我们将原来加的 \(1\) 替换为 \(dep_{u}^k-(dep_{u} - 1)^k\) 这样在做类似前缀和的时候即可处理。使用树剖配合线段树就可以做这个事情。

感觉对这个转化已经很敏感了,这种就是将与 \(dep\)\(lca\) 强相关的东西即可转化为与路径相关的 可差分结构,这是很重要的,后续处理无论是直接维护还是使用莫队等离线做法都是很关键的。

F.芒果冰加了空气

神秘题目。

显然如果正向考虑是不可以的,考虑将分治过程转为合并过程。钦定将某一次的分治中心任意归为一个联通块,所以下面的考虑是不单独处理分治中心的。

考虑两个联通块的合并,且这个联通块以点分树的形式呈现。考虑两个联通块中的一条边 \((u,v)\),且两个联通块的根为 \(x\)\(y\),钦定 \(x\) 作为新的根。考虑合并的方案,显然是合并 \(u\rightarrow x\)\(v \rightarrow y\) 的两条链,方案数为 \(\binom{len_1+len_2}{len_1}\)。且可以发现,若两条链的归并方案固定,则联通块合并方案固定。

考虑状态设计,设 \(dp_{u,j}\) 表示目前 \(u\) 所在的点分树中,\(u\) 到根的距离为 \(j\) 的方案数。转移是一般的
\(dp_{u,x\sim x+y}\leftarrow dp_{u,x} \times dp_{v,y} \times \binom{x+y}{x}\),时间复杂度 \(O(n^3)\)

优化转移过程,可以是用后缀和,发现这个东西是类似于背包的,考虑枚举 \(x+y\)\(x\),则转移的时间复杂度与树上背包相同,为 \(O(n^2)\)

C.网格上的 LIS

更加神秘。

有单调性,可以二分答案。由 Dilworth 定理,将最长链转化为最小反链划分(重定义偏序关系即可)。考虑二分的 \(mid\),我们需要构造出 \(mid\) 条路径。这些路径一定形如从左下角到右上角的一条可以向上或向右的路径。这个东西必须要求能够放下 \(\sum a_i\) 个黑格子。显然根据贪心,我们将这 \(mid\) 条路径的起点放置在 \((n,1),(n-1,1)\dots (n-k+1,1)\) 这些地方。

考虑从 \(i-1\) 列推至第 \(i\) 列的时候如何做。显然若 \(a_i < mid\) 我们直接选择 \(a_i\) 条路径涂黑即可。而当 \(a_i > mid\) 我们需要将一些路径向上移动。可以贪心考虑这个事情,可以先将上方的点移动,若不可移动了,再进行第二个点的移动。

但是这样每一次都做构造太麻烦了,可以发现,在二分的 check 过程中,我们只关心合法性,所以显然需要向上移动的次数为 \(\sum \max(0,a_i-mid)\),而全部点能上移的次数为 \(mid\times (n-mid)\)。则 check 成功的条件为前者小于等于后者。

Day 2

模拟赛

A.双网通行

很简单的题目,考虑 \((u,v)\) 之间的答案,不难发现只有三种情况。

  • 两者之间有边或者颜色相同,此时 \(D(u,v) = 1\)
  • 先通过一次第二种转移,再走一条边,或者反过来,此时 \(D(u,v)=2\)
  • 先转移,走一条边,再转移,此时 \(D(u,v)=3\)

三种情况的出现次数是很好预处理的。

B.栏目排列

首先显然对于每一行,贡献为 \(k-cnt\),其中 \(cnt\) 是相邻的个数,基于这个我们可以有一个 dp。设 \(dp_{msk, i}\) 表示目前已经分配了 \(msk\) 这些数了,最后一个数是 \(i\) 的最大 \(\sum cnt\) 。则转移为 \(dp_{msk \cup \{j\},j} \leftarrow dp_{msk,i} + cst(i,j)\)

时间复杂度是 \(O(m^2\times 2^m + nm^2)\) 的。

C.序列消除

首先考虑原始的区间 dp。设 \(dp_{l,r}\) 表示将 \([l,r]\) 全部消除的方案数。枚举消除的数字 \(c\),然后转移即可。

但是这样是 \(O(n^3\times V)\) 的,显然不能通过。考虑优化状态数。当我们去刻画消除的时候,对于最左边的小区间,右端点一定是 \(l\) 之后第一次出现 \(c\) 的前一个位置;而最右边的小区间,左端点一定是 \(r\) 之前第一次出现 \(c\) 的后一个位置。这样说明所有的有用的状态数是 \(O(nV)\) 的。

考虑一些 Corner Case 就可以做了。

D.停机检查

Halting Problem

神秘题目。

首先考虑将 \(x=a_i\) 的不平凡转移剥离,断言这种不平凡的转移一定是很少的。实际上也是,倘若两次经过 \(a_i\) 这个位置的话,显然进入了环,答案为 \(-1\)

考虑从 \(i\)\(e_i\) 连有向边,可以发现形成了树或者环或者基环树。考虑更一般的基环树的情况。我们需要加速去跑的过程。则可以利用不平凡的转移很少的条件。考虑去预处理从 \((x,i)\) 这个状态出发,下一次遇到 \(x'=a_j\)\(j\) 以及步数是多少。分成两个部分,一个是在树上跳,一个是在环上跳。

树上的情况很简单,就是考虑做树上前缀和 \(s_u\) ,则 \(x\) 能在 \(v\) 点碰到 \(a_v\) 的条件为 \(x+s_u = v + s_v\)。这个可以在 DFS 过程中维护一个栈,来维护第一个 \(v+s_v = x+s_u\)\(v\)

然后环上是个类似于同余式子的东西,可以在环上维护前缀和,然后可以发现,你的第一次不平凡的转移一定是你要查询 \(k\times sum + pre_j - pre_i\) 的类似物体,使用简单 lower_bound 和同余即可解决。

主要是实现很困难。

Day 3

模拟赛

B.分层编辑器

加入一个撤销操作 \(i\),需要找到前面的第一个 \(a_j < a_i\),发现 \([1,j-1]\)\(0/1\) 状态应该和 \(j-1\) 时刻的时候是一样的。将 \(i\)\(j\) 连一条边。则一次加入操作可以转化为在这些边上跳跃,加速跳跃可以使用倍增,这个是好维护的。时间复杂度 \(O(n\log n)\)

D. 快速旋转

这里将三种操作看成头指针的移动。

从大到小考虑过程,设 \(dp_{v,i}\) 表示处理完了大于等于 \(v\) 的数,最后的头指针停在 \(i\) 的最小代价。显然 \(a_i=v\) 才有意义,状态数 \(O(n)\)。当 \(v\rightarrow v-1\),假设之前的头指针停在 \(pre\) 这个位置。可以将头指针转移到两侧最近的一个 \(a_i=v-1\) 的地方,且显然转移到其他头指针不优。

来考虑以怎样的顺序删掉所有 \(a_i=v-1\) 的点。可以划分为以下三种:

  • 直接从当前点顺时针或者逆时针删除。可以直接转移。
  • 先逆时针转动,再顺时针转动。可以认为所有 \(v-1\) 都是在顺时针转动的时候删除的(因为顺时针转动的删除不需要支付 \(v-1\) 的代价)。直接使用头指针移动的代价减去所有 \(v-1\) 的代价就行。
  • 先顺时针转动,再逆时针转动。按照转动方向分为两个阶段。第一个阶段删除 \(v-1\) 不需要任何代价,而第二阶段每一次删除需要支付 \(v-1\) 的代价。可以将少的代价在第一阶段里面去计算。即从 \(i\) 移动至 \(j\) 的代价是 \([i,j)\) 内所有小于 \(v-1\) 的数的和减去 \(v-1\)。这可能导致出现负贡献。这导致转移错误。

前两种的转移是简单的,可以使用树状数组维护转移代价 \(Cst(i,j)\)

对于第三种情况,我们采用单调队列优化,避免 \(O(s^2)\) 的枚举。

设当前权值为 \(v\),位置列表为 \(p[0..s-1]\)(环上顺时针顺序)。我们将环展开成链,复制一份 \(p\),使得索引 \(i\)\(0\)\(2s-1\) 表示展开后的位置。

定义

\[\text{pref}(x)=\sum_{k=1}^{x-1} w_k \]

即树状数组中未删除元素(权值 \(\le v\))的前缀和,其中 \(w_k\) 为位置 \(k\) 的元素值(若已删除则为 0)。

对于终点 \(t\)(最终停在 \(p[t]\) 之后),我们枚举起点 \(i\),满足 \(i\in[t+1,\ t+s-1]\)(即逆时针最多走 \(s-1\) 步)。那么总代价可写成:

\[dp[i] + \big(\text{pref}(p[t]) - \text{pref}(p[i])\big) - (i-t)\cdot v \]

整理得:

\[dp[i] - \text{pref}(p[i]) + i\cdot v \ +\ \big(\text{pref}(p[t]) - t\cdot v\big) \]

对于固定的 \(t\),后半部分是常数,我们只需最小化

\[f(i)=dp[i] - \text{pref}(p[i]) + i\cdot v \]

在窗口 \([t+1,\ t+s-1]\) 内的最小值。
这是一个滑动窗口最小值问题,可以用单调队列 \(O(s)\) 求解。

实现时,我们将索引 \(i\)\(0\) 遍历到 \(2s-1\),维护队列 \(q\),使 \(f(q[0]) \le f(q[1]) \le \dots\),并确保队首与当前 \(i\) 的距离不超过 \(s-1\)。当 \(i\ge s\) 时,终点 \(t=i-s\) 的答案即为:

\[dp[t] - f(i) + f(q[0]) \]

这样我们就在线性时间内处理了第三种情况的全部转移。

最终,所有权值处理完后,\(dp\) 中的最小值即为答案。

C.画布

将每一个联通块钦定到最前面的一列中,显然这一列和前一列(环上)会长成三种情况,其中两种是同构的。可以通过关系构造出 \(L\) 的取值区间和 \(R\) 的取值区间,容易转化为二维数点问题,使用线段树解决。具体的,在线段树每一个节点上维护 \(min\)\(cnt\) 数组表示 \(min\sim min+10\) 的个数。

Day 4

图论

A.Mike and Fish

第一种做法是考虑将 \(x\) 相等的和 \(y\) 相等的东西做两两匹配,并钦定一个为蓝色,一个为红色。匹配方式是随便将横坐标相等的放在一起,多余的不用考虑。这样练出来的图应当是一个二分图。因为考虑在图上跳跃,一定是会走一条横向的边,然后再走纵向的边,再走横向……这样能保证连接出来的图没有奇环,直接在图上做二分图染色即可。

第二种做法很妙啊,对于一个坐标 \((x,y)\)\(R(x)\)\(C(y)\) 中间连接一条方向不确定的边。可以定义若 \(col(x,y) = 1\),则 \(R(x) \rightarrow C(y)\) 否则是反向。考虑弱化版:每一个点的度数都是偶数,可以在图上跑欧拉回路,并按照回路顺序分配方向。若有奇点,我们可以建立一个虚点,让奇度数的点向虚点连边,显然奇度数的点合法,且虚点的度数为偶数,这样就规约成了弱化版。

B.anybody can finds love (expect you)

首先可以快速判断无解,就是有奇度数点或者在某一个点的邻接点中有绝对众数,此时是无解。

考虑对于 \(u\) 这个点,一定存在 \(\frac{deg_u}{2}\) 个入边和 \(\frac{deg_u}{2}\) 个出边。要求不存在 \(x\rightarrow y \rightarrow x\),等价于相邻入边和出边关联的邻接点不相同。由于对于任意邻接点 \(v\)\(cnt_v \le \frac{deg_u}{2}\),则显然可以对于邻接点进行匹配。这样就匹配出了一个一个的环。现在需要合并环。可以使用并查集或者直接 DFS 一遍。

最妙的点在于将原本的条件转化为了关于边的匹配问题。

F.铁人两项

\(s\)\(c\) 去找 \(f\) 显然不好做。考虑从 \(s\rightarrow f\) 的路径上去找 \(c\),对于确定的 \(s,f\)\(c\) 的取值显然为 \(\cup \operatorname{Route}_{s\rightarrow f}\),其中 \(\operatorname{Route}\) 为某一条路径上所有点所构成的集合。

对于路径并这个东西,可以考虑使用圆方树,因为对于一个点双联通分量,\(u,v\) 之间的所有的路径的并为这个点双。则设圆点的权值为 \(-1\),而对于方点权值为点双大小。然后答案为树上两两圆点之间的路径长度的和。

C.Two Trees

首先不难发现 \(-1\)\(1\) 都是奇数,为了让绝对值为 \(1\),显然需要让两棵树上儿子个数的奇偶性相同,否则无解。

考虑将树根这种特别的点处理掉(因为树根没有父亲),可以考虑建一个虚点,将两个树根连起来。考虑现在怎么做?有一个初步的想法是,对于每一个 \(u\),若它有奇数个儿子,那么我们让 \(\lfloor\frac{cnt}{2}\rfloor\) 个儿子取 \(col \in \{-1,1\}\),让剩下的取另外一种取 \(-col\),并令 \(col_u = 0\)。反之,令 \(col_u=1 / -1\),令 \(\frac{cnt}{2}\) 个取 \(1\),剩下的全取 \(-1\)。具体哪些取 \(1\),哪些取 \(-1\) 仍然无法估计。

由于和奇偶性强相关,考虑欧拉路。唯一棘手的是无法将奇点去掉。考虑将一个奇点 \(u\) 在两棵树上的对应点连起来,这样全是偶点。跑出一个欧拉回路。这时,考虑原来的奇点 \(u\)\(u'\) 加入欧拉回路的时机。若 \(u\) 先于 \(u'\) 加入欧拉回路,则钦定 \(col_u = 1\),反之则为 \(-1\)

为什么这样是正确的?考虑将欧拉回路拆分成若干的环,分开计算贡献。

  • \(u\) 出发,往儿子走,从自己的横插边回来:这时,在儿子走到另外一棵树的时候,对于另一棵树的 \(u\) 进行了 \(-1\) 的贡献,而你回来的时候对 \(u\) 进行了 \(1\) 的贡献,总贡献为 \(0\)
  • \(u\) 出发,往儿子走,从儿子回来:显然没有贡献。
  • \(u\) 出发,往儿子走,从父亲回来:此时对答案的贡献应该为 \(1\),即:从儿子进入另一棵树,再走到 \(u\) 的某一个祖宗在另一棵子树的对应点,从横插边返回。
  • \(u\) 出发,走横插边,并从父亲回来:此时对答案的贡献为 \(1\)

这里发现最后两类环只会出现一次,因为 \((fa,u)\) 这条边只能走一次。则能保证正确性。

Day 5

lhr 讲课,图论。

E.旅行

贪心地来想,要让 \(max\) 尽可能的小,显然走的边越少越好。但是要让 \(min\) 尽可能的小,显然走的边越多越好。两者相互矛盾,似乎不能一起做。

考虑枚举 \(max\),求出 \(1\) 到每一个点的最小边。容易发现 \(e\)\(1\rightarrow u\) 的无重边路径上当且仅当 \(e\) 所属的边双在 \(1\) 所在边双到 \(u\) 所在边双的路径上。

考虑动态维护一棵边双缩点之后的树。将边分成若干部分。

  • 如果一条边连接两个联通块,那么这条边一定在原图的最小生成树上。可以预先建出最小生成树,在树上处理相应的信息。
  • 如果一条边连接两个不同的边双 \(u,v\) ,那么就是把 \(u\rightarrow v\) 之间的所有边双全部缩成一个点,把 \(u\rightarrow \operatorname{LCA}(u,v)\)\(v\rightarrow \operatorname{LCA}(u,v)\) 之间的所有最小边权更新。
  • 如果连接相同的点双,则这条边不会对答案产生任何贡献。

注意到每个边双联通分量都是最小生成树上的连通块,我们可以直接在最小生成树用并查集上维护这个过程,那么第二类边就是对子树权值 chkmin。

但是注意加入这类边前可能有第二类边在这个点的祖先上对答案做 chkmin 操作,但是操作时的最大边权并不对,我们只要在每个点第一次和根节点联通时把之前对答案的 chkmin 操作全部删掉即可。

我们需要一棵线段树维护区间 chkmin,单点修改和单点查询。

Day 6

lhr 讲课,杂题。

A.Żelki

由于要求取出相同数量的糖豆,所以可以考虑每一种取一个出来考虑。由于 \(n,m\) 都比较小,可以背包,设 \(f_j\) 表示所有颜色都取出一种,且重量模 \(m\)\(j\) 的最小花费。显然 \(f\) 可以预处理。预处理后就可以直接做同余最短路。由于是稠密图,使用朴素的 Djikstra 更加优秀。

B. The way home

观察到,你进行表演一定是在 \(1 \rightarrow i\) 中的 \(w\) 的前缀最大值处。考虑到 \(n\) 很小,可以设 \(dp_{i,j}\) 表示目前在 \(i\) 这个位置,上一次表演是在 \(j\) 这个点的最小表演次数和在保证表演次数最小的情况下能够剩下的最大钱数。倘若考虑 \((i,lst) \rightarrow j\),若无法通过且 \(w_{lst} < w_i\) ,则我们直接在 \(i\) 这个位置表演,且转移至 \((j,i)\),否则仍然在 \(lst\) 处表演,且转移至 \((j,lst)\)

C.Manhattan Max Matching

显然可以建 \(O(n^2)\) 条边跑费用流,但是这样显然无法通过。注意到 \(|a-b| = \max(a - b, b - a)\)。而答案要求的正好是 \(max\),所以考虑分别按照 \(x_1-y_1,x_2 - y_2\) 的符号分成四种情况,每种情况分开连边,这样就可以直接跑费用流了。

E.Exhausted?

显然答案可以转化为求最大匹配问题。而题目对于任意左部点的右部点的匹配较为特殊,为:\([1,l_i] \cup [r_i,n]\)。则对于左部点集 \(S\)\(N(S)=[1,\max\limits_{i\in S} l_i] \cup [\min\limits_{i \in S} r_i, n]\)。最小失配数量等于 \(\max (|S| - |N(S)|)\)。考虑将所有人按照 \(l_i\) 排序,再进行扫描线,容易发现,每一次插入的点影响的是一段后缀。很好在线段树上去维护。

Day 7

杂题。

K.精确打击

\(G\) 合法(即存在回路,且交集不为空集)的条件是只有一个 SCC,特别的,单点不计入 SCC。显然可以去找环。考虑将这个环删掉,维护环上哪些点是答案。对于 \(i\),若有一个 \(j\) 满足 \(i\) 在新的图上能够到达 \(j\),且 \(i < j\)\((i,j)\) 这一段就不合法。同样的,若 \(i>j\)\((i,n] \cup [1,j)\) 不合法,这些东西直接跑拓扑序的之后预处理就可以。

I.Kevin and Teams

很牛的题目。猜测 \(k=\lfloor \frac{n+1}{3} \rfloor\)。考虑证明这个东西。

假设一个最大红色匹配 \(M\),设 \(|M|=m\),且 \(N = U \setminus M\)。下面我们证明 \(|U| < m + 2\)。设 \(e \in M\),则 至多有一个 \(N\) 中的点,与 \(e\) 的两个端点之一有红边,否则,你一定可以通过调整得到一个大小为 \(m+1\) 的匹配,矛盾。因此可以用霍尔匹配引理,给每条 \(e \in M\) 选一个不同的 \(N\) 中的点,使得该点与 \(e\) 的某个端点之间是蓝边。这样得到 \(m\) 条互不相交的蓝边;而 \(N\) 中至少还剩 2 个点,它们之间也是蓝边。于是得到一个大小为 \(m + 1\) 的蓝色匹配,与 \(m\) 的最大性矛盾。

所以可以得到 \(k\) 是一个下界,且可以取到。

其实这个东西是一个定理:Cockayne–Lorimer 定理。

对于给定的正整数 \(n_1,n_2,\dots,n_t\),记 \(n_iK_2\) 为大小为 \(n_i\) 的匹配(点数为 \(2n_i\)),则多色拉姆齐数

\[R(n_1K_2,n_2K_2,\dots,n_tK_2)=\max\{n_1,\dots,n_t\}+1+\sum_{i=1}^{t}(n_i-1). \]

这个东西中多色拉姆齐数的含义求一个最小正整数 \(n\),使得无论用什么颜色对 \(K_n\) 的边染色,都必然存在某种颜色 \(i\),使得所有该颜色的边形成一个大小为 \(n_i\) 的匹配。

比如运用到这道题目中,我们要求 \(R(kK_2,kK_2) \le n\) 的最大的 \(k\),套用公式得到 \(k+1+2(k-1)\le n \quad\Longrightarrow\quad 3k\le n+1,\)
\(k\le \left\lfloor \frac{n+1}{3} \right\rfloor.\)

下界是紧的这个证明可以用构造:

考虑设 \(mx = \max\{n_i\}\),则 \(N=R(n_1K_2,n_2K_2,\dots,n_tK_2)\),我们仅需证明 \(K_{N-1}\) 存在染色,使得 \(i\) 这种染色的最大匹配数之多为 \(n_i-1\)

为此,我们采用如下直接构造。不失一般性,令 \(n_1=\max\{n_1,n_2,\dots,n_t\},\)并记 \(N=n_1+1+\sum_{i=1}^{t}(n_i-1).\)
我们证明 \(K_{N-1}\) 上存在一种边染色,满足要求。

将顶点集划分为 \(t\) 个互不相交的部分 \(A_1,A_2,\dots,A_t\),其中 \(|A_1|=2n_1-1,\qquad |A_i|=n_i-1\quad (2\le i\le t).\)
顶点总数为 \((2n_1-1)+\sum_{i=2}^{t}(n_i-1)=N-1.\)

染色规则如下:

  • 同一 \(A_1\) 内部的边全部染颜色 1;
  • 同一 \(A_i\)\(i\ge2\))内部的边全部染颜色 \(i\)
  • 对于跨部分的边,若一端在 \(A_i\),另一端在 \(A_j\)\(i<j\),则染颜色 \(j\)(即较大下标对应的颜色)。

现在验证每种颜色的最大匹配大小:

  • 颜色 1 的边只出现在 \(A_1\) 内部,而 \(A_1\)\(2n_1-1\) 个顶点,其最大匹配大小 \(\left\lfloor \frac{2n_1-1}{2} \right\rfloor = n_1-1.\)
    因此颜色 1 的匹配至多有 \(n_1-1\) 条边。

  • 对于任意颜色 \(i\ge2\),观察颜色 \(i\) 的边:所有边都至少包含一个属于 \(A_i\) 的端点(内部边两个端点都在 \(A_i\),跨边一端在 \(A_i\))。因此,在一个颜色 \(i\) 的匹配中,每条边都消耗 \(A_i\) 中不同的顶点,故匹配的边数不可能超过 \(|A_i|=n_i-1\)

综上,在 \(K_{N-1}\) 中不存在任何颜色 \(i\) 的大小为 \(n_i\) 的匹配,因此 \(R(n_1K_2,\dots,n_tK_2)\ge N.\)
结合定理给出的上界 \(R\le N\),即得 \(R=N\),从而下界是紧的。

对于本题的双色情形(\(t=2\),即 \(n_1=n_2=k\)),上述构造给出当 \(n=3k-2\) 时无法保证有 \(k\) 条同色匹配,因此 \(k=\left\lfloor \frac{n+1}{3} \right\rfloor\) 是能达到的最大值,且下界紧。

接下来考虑如何构造答案。由于答案 \(k = \lfloor \frac{n+1}{3} \rfloor\),这提示可以在增量法的前提下,使用三个点,使得答案加一。考虑维护一条链,链上的所有关系均相同。若新插入一个点 \(x\),设此时链尾为 \(lst\),链尾前一个为 \(pre\),若 \(x\)\(lst\) 的关系和整条链不同,则向两个匹配中分别加入 \((lst, x)\)\((lst,pre)\),这样就可以保证每 \(3\) 个点一定会至少贡献一个匹配了。

H.小班课

考虑答案的上界,显然为最大匹配。直觉上,答案应该小于最大匹配数。但是实际上可以取到等号。构造方法如下:考虑按照优先级跑匈牙利,设 \(M(u)\)\(u\) 匹配到的点。则考虑单点:\(u\),对于任意优先级高于 \(M(u)\) 的所有课程 \(v\),对于 \(M(x)=v\)\(x\),我们连接一条从 \(x\)\(u\) 的边,表示 \(x\) 要在 \(u\) 前面先选。但是这样会有环,处理环的方法就是将 \(M\) 前移,显然匹配不会更劣。时间复杂度是 \(O(n^3)\) 的。

Day 8

树论 + 定时练习。

A.Tree Weights

显然可以将 \(d_i = dep_{i} + dep_{i+1} - 2dep_{lca(i,i+1)}\),由于 \(dep_{0}=1\),显然可以做类似递推的事情:\(dep_{i+1} = d_i - dep_i + 2 dep_{lca(i,i+1)}\),但是 \(dep_{lca(i,i+1)}\) 的值可能还没有定。一个想法是把上面的递推式对 \(2\) 取模,就能消去上式中 \(dep_{lca(i,i+1)}\) 的影响,这样能得到所有 \(i\) 的二进制的第 \(0\) 位。再考虑对 \(4\) 取模,这个时候由于我们有 \(dep_{lca(i,i+1)}\)\(2\) 的值,显然可以推出模 \(4\) 的值,一直做到第 \(60\) 位即可。

C.Range Diameter Sum

记录一下树上圆理论。设 \(f(u,r) = \{v| \operatorname{dis}(u,v) \le r\}\)。我们有如下推论:

  • \(S\) 点集中最远点对 \((x,y)\) 之间的距离为 \(d\),中点为 \(u\),显然有 \(f(u,\frac{d}{2}) \supseteq S\)
  • \(f(u_1,r_1) \supseteq f(u_2,r_2)\Leftrightarrow r_1 \ge r_2 + \operatorname{dis}(u_1,u_2)\)
  • \(c(S)\) 为包含 \(S\) 的最小圆,则 \(c(S_1 \cup S_2)=f(\operatorname{move}(u_1,u_2, \frac{\operatorname{dis}(u_1,u_2)-r_1+r_2}{2}),\frac{\operatorname{dis}(u_1,u_2)+r_1+r_2}{2})\),要求是 \(S_1\cap S_2 = \emptyset\)。若 \(S_1 \subseteq S_2\),则 \(c(S_1\cup S_2) = c(S_2)\)。L
  • 对于 \(v \in f(u,r)\),则 \(\max_{x\in f(u,r)} \operatorname{dis}(v,x)) = r + \operatorname{dis}(u,v)\)

考虑分治去做这个事情。设目前的分治区间为 \([l,r]\),区间中点为 \(mid\),考虑维护 \(Lft_i\) 表示将 \([i,mid]\) 区间合并出来的圆,\(Rgt_i\) 表示将 \((mid,i]\) 的区间合并出来的圆。显然我们考虑合并:对于每一个 \(i\),维护 \(Lft_i \cup Rgt_j\) 的半径的两倍。不难发现 \(Lft_i \subset Lft_{i-1}\),且 \(Rgt_j\subset Rgt_{j+1}\)。则可以将 \(j\) 划分成以下三个部分:

  • \(Lft_i \subset Rgt_j\),此时贡献为 \(2r_j\)
  • \(Lft_i \cap Rgt_j \not= \emptyset\),此时的贡献为 \(\operatorname{dis}(u_i,u_j)+r_i+r_j\),这个东西的 \(r_i + r_j\) 是容易的,然后距离等价于求这样一个事情:\(\sum\limits_{i\in[l,r]} \operatorname{dis}(i,x)\),可以树剖双 \(log\) 做。
  • \(Lft_i \supset Rgt_j\),此时贡献为 \(2r_i\)

考虑 \(i\rightarrow i+1\),考虑维护这三段的分界点 \(p,q\),显然 \(p,q\) 单调不减,直接双指针就行。

时间复杂度是 \(O(n\log^3n)\),其实可以做到 \(O(n\log^2n)\),只需要将中间那种情况放到点分树上做就行。

A.Yura and Deadlines

一个显然的转化是,将 \(\max(a_i,a_j) < |i-j|\) 转为 \(a_i<|i-j|\)\(a_j < |i-j|\)。钦定 \(i>j\),则 \(i>a_j + j\)\(j < i - a_i\),显然可以放到树状数组上面做。

C.Diameter Intersections

显然直径的中点不变,而题目中本身保证了直径长度为奇数,显然直接找到中心边后做树上操作。感知上来说你去求 \(dep_{LCA}\) 是一个暴力,实则是 \(O(\sqrt{N})\) 的。所以暴力合并两端即可。时间复杂度是 \(O(N)\)

D.Idiot First Search and Queries

首先很明显访问顺序就是欧拉序。考虑刻画这个过程,显然你会先将 \(v\) 的子树访问了,然后去访问 \(fa_v\) 的所有子树,然后访问所有 \(fa_{fa_v}\) 的子树。以此类推。可以维护倍增表 \(f_{i,j}\) 表示从 \(j\) 出发,向上跳 \(2^i\) 个祖宗,且访问完其所有子树所需要的步数。然后回答询问直接查询就可以。对于多的部分,可以直接预处理全树的欧拉序,从断开的位置向后查询就行。

Day 9

lsh 讲课 + 定时。

B.XOR Sorting (Hard Version)

按位考虑。很明显可以发现,\(k\) 的 Highbit 是很重要的。显然当 \(k=2^x\) 的时候最优秀。考虑发现对于 \([1,2^x]\) 显然可以随便交换,\([2^x,2^{x+1}]\) 显然可以随便交换。所以只需要求最小的 \(x\),使得每 \(2^x\) 长度的块内都有序,且合起来整体有序。这个东西可以直接线段树解决。

D.Elections in Saransk (hard version)

显然考虑拆分质数,设 \(x\) 中有 \(k_0\) 个质数 \(p\),且 \(1\sim n\) 这些数分别选了 \(k_i\)\(p\),由定义显然有:\(k_0+\max\{a_i\} = \sum a_i\),这个东西显然可以 \(O(\log^3V)\) 做,所以时间复杂度是 \(O(n\log^3V)\) 的。

E.Jinx or Jackpot

好题。

首先考虑设 \(r_{i,j,x}\) 表示赢 \(i\) 次,输 \(j\) 次,且机器是 \(x\) 的概率,显然 \(r_{i,j,x} = \binom{i+j}{i} \times P_x^j\times (1-P_x)^{i-j}\),由条件概率反推得到在 \((i,j)\) 这一对约束的情况下,机器是 \(x\) 的概率为 \(\displaystyle \frac{r_{i,j,x}}{\sum_{l=1}^n r_{i,j,l}}\) 。设 \(a_{i,j}\) 表示目前已经赢了 \(i\) 次,输了 \(j\) 次,下一次成功的概率。考虑状态 \(dp_{i,j}\) 表示目前已经赢了 \(i\) 次,输了 \(j\) 次的期望翻的倍数。

我们有转移:

\[dp_{i,j} = \begin{cases} 1, & \text{if} \space i+j=k\\ \max(2\times dp_{i+1,j} \times a_{i,j}, a_{i,j} \times dp_{i+1,j} + (1-a_{i,j})\times dp_{i,j+1}),& \text{else} \end{cases} \]

然后转移即可。

Day 10

F.Shuffling Cards with Problem Solver 68!

好强的题目。

首先可以发现,若 \(i\) 的第 \(k - 1\) 位为 \(1\),则它变到 \(2\times (i-2^{k-1})+1\),否则变到 \(2\times (i-2^{k-1})\)

则可以看作是每一次变换等价于整体向左循环移位。反之,考虑最后的字符串下标 \(i\),原始坐标会循环右移 \(t\) 次。然后可以形如 SA 一样去算 rk。然后就做完了?

F.Spectral Components

好题。

首先你的最优的联通块显然包含带权重心,或者说你一定带有该颜色的一个带权重心。设颜色 \(c\) 的节点集合为 \(C\)\(|C|=m\)。最优连通块 \(S\) 一定包含 \(C\) 的带权重心 \(r\),即满足 \(\sum_{v\in C}\mathrm{dist}(v,r)\) 最小的节点。

\(r\) 为根,初始 \(S=\{r\}\),代价 \(C_0=\sum_{v\in C}\mathrm{dist}(v,r)\)。剩余 \(k_c-1\) 个点。每向一个子树方向扩展一个点,该子树内所有颜色 \(c\) 的点到 \(S\) 的距离都减少 \(1\),收益等于该子树内颜色 \(c\) 的点数。因此每次选当前收益最大的方向扩展即可,贪心正确,因为子树内点数随深度单调不增。

原树太大,对每种颜色建虚树,只保留 \(C\) 中的点和它们两两的 LCA。虚树边权为原树上的距离。在虚树上找带权重心 \(r\),计算 \(C_0\),再用优先队列按收益贪心扩展。注意虚树边长度可能大于 \(1\),一次可以走多步,收益不变。

答案 \(=C_0-\) 总收益。未出现的颜色输出 \(-1\)。复杂度 \(O(n\log n)\)

*.那一年的秘密基地

好题。

首先 \(O(qn^2\log n)\) 是容易的:枚举作为根的节点 \(rt\),然后用 \(O(n\log n)\) 的时间暴力去跑一个树上二维偏序。具体的,使用树状数组实时维护 $ < pos_u$ 的个数。考虑换根 dp,当 \(dp_{fa} \rightarrow dp_{u}\) 的时候,发现我们会减掉 \(\operatorname{subtree}(u)\) 里面 \(pos_v < pos_{fa}\) 的,并加上 \(\operatorname{subtree}(fa)\setminus \{fa\} \cup \operatorname{subtree}(u)\) 里面 \(pos_v < pos_u\) 的。这个东西显然可以离线下来维护,我们只需要调整他们更新的顺序即可。

考虑一次修改操作,实际上就是我们对于每一个 \(rt\) 考虑对 \(dp_{rt}\) 的影响。你考虑若交换后 \(a_{i+1}\)\(a_{i}\) 的祖先,则对应的 \(dp_{rt}\) 因该加一,而若 \(a_{i}\)\(a_{i+1}\) 的祖先,则对应的 \(dp_{rt}\) 因该减一,剩下的则不变。你发现 \(u=a_{i+1},v=a_{i}\),在 \(u\rightarrow v\) 的路径上的其他点的其他子树内的点做根,改变量为 \(0\),而 \(u\) 方向和 \(v\) 方向的点改变量为 \(+1/-1\)。这个东西,由于你的子树的 dfs 序是连续的,容易使用线段树来维护。时间复杂度 \(O(n\log n+q\log n)\)

*.魔兽地图

很水啊。

考虑设 \(dp_{u,i,j}\) 表示目前在 \(u\) 这个装备,然后你有 \(i\) 件要上传,目前在 \(u\) 子树中已经花费了 \(j\) 元的最大力量值。然后这个你直接枚举当前的 \(u\) 选多少就行了。时间复杂度大概是 \(O(nm^2\times V)\) 的。

posted @ 2026-08-31 21:15  To_string  阅读(44)  评论(0)    收藏  举报