MX 2026 集训

难度说明:Lv 1~8 分别为洛谷的红橙黄绿青蓝紫黑,用等级主要是为了带小数点

R1

R2

mex

R3

打的比较爆炸,就不放分了吧 /ll

  • 赛时:请输入文本
  • 补题:\(100+0+0+0=100\)

R4

  • 赛时:\(100+30+20+0=150\)
  • 补题:

max

写了三个小时的题目。

必要性探路:设总进球数为 \(T\),任意可行方案中最后一名球员的进球数 \(x\) 与助攻数 \(y\) 均为非负整数。总进球数等于所有人进球数之和,即 \(T=\sum_{i=1}^{n}a_i+x\ge \sum_{i=1}^{n}a_i=S_A\);同理总助攻数等于所有人助攻数之和,即 \(T=\sum_{i=1}^{n}b_i+y\ge \sum_{i=1}^{n}b_i=S_B\),因此 \(T\ge \max(S_A,S_B)\)。另一方面,每一粒进球必须由一名射手和一名助攻者完成且不能是同一人,所以对第 \(i\) 名球员,他参与的 \(a_i+b_i\) 个进球事件必须两两不同,从而 \(\forall i \in [1,n],a_i+b_i\le T\) 恒成立,故 \(T\ge \max_i(a_i+b_i)\)。综合这两类约束,任何可行方案都必须满足 \(T\ge \max\left(S_A,S_B,\max_i(a_i+b_i)\right)\),这就是答案的下界。

充分性证明:取 \(T_0=\max\left(S_A,S_B,\max_i(a_i+b_i)\right)\),并令最后一名球员的进球数 \(x=T_0-S_A\)、助攻数 \(y=T_0-S_B\)。由 \(T_0\ge S_A,S_B\) 知 \(x,y\ge 0\),满足非负整数要求,此时总进球数与总助攻数均为 \(T_0\),达到平衡。还需检查是否会出现自己助攻自己的情况:对前 \(n\) 名球员,由 \(T_0\ge \max_i(a_i+b_i)\) 可知每人的 \(a_i+b_i\le T_0\),可将其参与的事件分配到不同进球中;对最后一名球员,他参与的进球事件数为 \(x+y=2T_0-S_A-S_B\),而 \(S_A+S_B\ge \max(S_A,S_B)\) 且 \(S_A+S_B\ge \max_i(a_i+b_i)\),所以 \(S_A+S_B\ge T_0\),于是 \(x+y\le T_0\),也不会自己助攻自己。因此 \(T_0\) 是一个可行的总进球数,结合必要性下界,答案即为 \(\max\left(S_A,S_B,\max_i(a_i+b_i)\right)\)。

\(\max_i(a_i+b_i)\) 的求法:关键结论是:如果某个下标 \(i\) 既不是 \(A\) 区间的最大值位置,也不是 \(B\) 区间的最大值位置,那么 \(a_i+b_i\le \max(S_A,S_B)\),因此它不可能影响答案。证明很简单:若 \(i\) 不是 \(A\) 的最大值,则存在 \(j\) 使得 \(a_j\ge a_i\),所以 \(S_A\ge a_j+a_i\ge 2a_i\),即 \(a_i\le S_A/2\);同理,若 \(i\) 不是 \(B\) 的最大值,则 \(b_i\le S_B/2\)。于是 \(a_i+b_i\le (S_A+S_B)/2\le \max(S_A,S_B)\)。因此,答案中的 \(\max_i(a_i+b_i)\) 只需要考察 \(A\) 的最大值位置和 \(B\) 的最大值位置即可,因为只有这些位置才可能突破 \(\max(S_A,S_B)\)。

所以只需要维护一个前缀和和 ST 表即可。

R5

爆炸 Round,还是不放分了。T1 没有打出一点分,打暴力能力还是太差了 /ll

R9

\(60+0+0+8\),T3 似乎完全没看,T2 暴力感觉很难打

magic

首先从特殊性质入手,当没有 3 时,肯定直接把所有的 1,2 全部用上,因为如果不用的话肯定会给你一个最差的情况,用的话一定不劣。所以直接把 1 放左边 2 放右边然后跑一个树状数组求逆序对。

考虑 3 怎么办,首先一个很自然的想法就是分成两段,左边放一些连续的小的数,右边放一些连续的大的数,主要是分割点的问题。这里就是赛时的卡点了,所以只能 \(O(n)\) 枚举所有分割点,然后 \(O(n^2 \log n)\) 拿掉前四个点的分,和只有 1,2 的拼起来拿 60.

现在考虑正解。我只看了只有 3 那一档的部分分的题解,题解是这么写的:设 \(p_i\) 为 \([1,i]\) 中 0 的个数,\(q_i\) 为 \([i,n]\) 中 0 的个数,把 \(i\) 分到左侧会与其左侧的 \(p_i\) 个字符 \(0\) 产生逆序对;分到右侧会与其右侧的 \(q_i\) 个字符 \(0\) 产生逆序对。

然后就豁然开朗了,考虑把一个 3 放到左侧,会贡献其左边的字符 0,1 个数个逆序对;把一个 3 放到右侧,会贡献其右边的字符 0,2 个数个逆序对。然后显然每一位分别独立,贪心考虑就好了。

赛时主要是没有深入分析这个逆序对的贡献,一直在想那个分割点去了,还想着能不能根据分割点三分,然后也不知道有没有单峰性。

R10

\(30+0+4+0\),一直想冲 T1 正解,可是代码特别难写,最后时间不够了。不要头铁冲正解

road

超级大模拟题,思维难度远小于代码难度。赛时调试输出忘记删了导致特殊性质 D 挂了 10 分

R11

\(100+6+0+0\),T1 正解冲了 3h+ 终于冲出来,然后剩下 1h 左右打暴力只打了 6pts,感觉后面的 T2~T4 还是有一点的提升空间,还需要提升切绿/青的概率和速度。但是绿/青似乎是有点困难的。

bypass

评定:Lv. 4.999

赛时多测没有清空数组,然后怒调 1h。

首先根据 P7299 [USACO21JAN] Dance Mooves S 的经典 trick 可以想到要把 \((i,p_i)\) 连有向边建图(其实部分分那里也有提示),然后就可以得到若干个环。接着再模拟一下样例,发现每次进行一次交换就是在环上删除一个结点(如 \(u_1 \to u_2 \to u_3\) 变成 \(u_1 \to u_3\)),如果只有两个点的环,就是直接删除这两个点。

于是问题转化为:给定 \(m\) 个环,第 \(i\) 个环有 \(w_i\) 个点,给定恰好 \(k\) 次操作次数,你可以给第 \(i\) 个环分 \(l\) 次操作,要求 \(l \in [0,w_i-1]\),每次操作选择一个点删除,若环只剩下两个点,则全部删除。每一种操作会贡献 \(\binom{w_i}{l_i}\) 种不同的方案(若 \(w_i=l_i+1\),则只算一种方案),求一共有多少种方案。

然后可以用背包 DP,设 \(dp_{i,j}\) 表示现在考虑到第 \(i\) 个环,并且花费了 \(j\) 次操作,然后枚举当前操作次数 \(l\) 就有 \(dp_{i,j}=\sum_{l=0}^{\min(w_i-1,j)} dp_{i-1,j-l} \cdot \binom{w_i}{l}\),可以用滚动数组压掉第一维,注意要倒着来。

S 组公开赛

不知道为什么挂到只剩 \(45+26+0+0=71\) 了,或许因为国庆放假在家打的没啥心思。

beforepass

Lv. 4.3

考虑找性质。当 \(\forall i,b_i \ge 2\) 时,显然答案为 \(1\),这是 trivial 的,因为每个珠子都要传给下一个盒子一个珠子。当 \(b_i=1,b_i=0\) 时就有多种可能。

直接研究 \(a_i\) 的值会很麻烦,因为状态太多了,然后发现有两个很重要的东西,一个是自己有没有给别人传,一个是别人有没有给自己传。所以设 \(c_i=[a_i \ge 0]\) 表示自己有没有别人传,然后 \(b_i=a_i+c_{i-1}-c_i\)。\(c_i \in \left\{0,1\right\}\),状态数很小。

然后考虑研究这个 \(c_i\)。根据 \(b_i=0,b_i=1,b_i>1\) 分类讨论,不难得出以下几种情况:

  • \(b_i=0\):\((c_{i-1},c_i)\) 可能为 \((0,1) (0,0)\)
  • \(b_i=1\):\((c_{i-1},c_i)\) 可能为 \((1,0) (0,1) (1,1)\)
  • \(b_i>1\):\((c_{i-1},c_i)\) 可能为 \((0,1) (1,1)\)

然后就可以设 \(dp_{i,0/1}\) 表示当前考虑到 \(i\) 且 \(c_i=0/1\) 的方案数,DP 转移也很显然就直接从上一位加一加就可以了,唯一要注意的是这个是一个环,所以你得钦定 \(c_0=0 \operatorname{or} 1\),然后 \(dp_{0,c_0}=1,dp_{0,1-c_0}=0\),最后钦定了 \(c_0\) 的答案为 \(dp_{n,c_0}\)(因为是一个环,\(c_0=c_n\))

这个计数方法特别典,但是场上只想出来了用 \(a_i\) 做状态,所以不会了。

inspection

Lv. 6.7

最后一部分实在写不动了,GPT 给我了一个 7.2k 的代码,吓哭了。

首先手玩一下,发现肯定是选一个链,然后链上的只要走一次,其他的点需要走两次(从主链上跑下来再跑回去),然后需要最大化走一次的点的个数,显然是树的直径上的点,共有 \(D-1\) 个。于是第一问的答案就是 \(D+2(n-D-1)\),其中 \(D\) 为直径。

难点在于计数。最优情况是从直径的左端点 \(s\) 走到右端点 \(t\),中间有支链的话就走一下。对于一条直径,在直径上的点 \(u\)(如 \(2\))以及其支链子树根结点(绿色)可以以任意顺序访问,共有 \((d_u-1)!\) 中情况。(\(d_u\) 为 \(u\) 的度数)然后对于一个在支链中的点(如 \(9\)),他及其子树根结点可以以任意顺序访问,共 \(d_u!\) 种。所以对于一条直径 \((s,t)\),贡献的方案数为:

\[N(s,t)=\prod_{u\in P(s,t)} (d_u-1)! \prod_{u \not \in P(s,t)} d_u!=\dfrac{\prod_u d_u!}{\prod_{u \in P(s,t)}d_u} \]

提取出公因式 \(\prod_u d_u!=C\),最后就是转化为求

\[\sum_s\sum_{t \neq s} \prod_{u \in P(s,t)}d_u ^{-1} \]

的值了(其中 \(s,t\) 为直径端点,\(P(s,t)\) 表示 \(s \to t\) 的简单路径上的点构成的集合)。

img

直接枚举直径最坏是 \(\Theta(n^2)\) 的,期望得分是 \(60 \operatorname{pts}\)。考虑如何拼出直径:选定树的中心,然后以它为起点可以弄出很多半径,最终就是半径的组合。因为树的中心可能会有一个或两个,所以分讨:

  1. 若直径长度为偶数,则有一个中心 \(c\)(画一个图看一下就好了)

    此时找出所有半径,然后考虑半径之间两两组合(注意是有方向的,所以 \(r_1-c-r_2\) 和 \(r_2-c-r_1\) 是两种不同的半径)
    给半径的起点(非 \(c\) 端)设置一个权值 \(S_i\),

    \[S_{i}=\prod_{x \in P(s,v_i)} d_x^{-1} \]

    最终就是两两权值的组合,然后再根据 P1351 [NOIP 2014 提高组] 联合权值 的 trick 把求和转化成和的平方减平方的和

    \[S=\sum_{i}\sum_{j \neq i} S_i S_j=\left ( \sum_iS_i \right )^2-\left ( \sum_iS_i^2 \right ) \]

    对了,别忘了把中心端点的 \(d_c^{-1}\) 乘上去,答案就是 \(C \cdot d_c^{-1} \cdot S\)

  2. 若直径长度为奇数,则有两个中心 \(c_1,c_2\)

    那么也同理,考虑 \(c_1\) 左边和 \(c_2\) 右边的情况,然后就是

    \[\sum_{i为c_1侧直径端点}\sum_{j为c_2侧直径端点}S_iS_j=(\sum_{i为c_1侧直径端点}S_i)(\sum_{j为c_2侧直径端点}S_j) \]

    同样乘上 \(d_{c_1}^{-1} \cdot d_{c_2}^{-1}\)。

总结:这个题目考察了树的中心的性质,并且还要 所有直径转化为两个不相同的半径拼一起,而且对计数能力的综合能力要求很高,想到 \(O(n^3)\) 的做法(就是直接枚举直径)难度估计只有 Lv 5.0,但是后面的转化感觉是非常困难的,而且代码还特别难写。

R13

watch

Lv 5.1

限制太多,看看能不能去掉某个边界。观察到对于相邻的两个人,若距离 \(<L\),则只能同时为守卫或平民,所以就可以把原序列切成一些块,每一块一起决策,这样就把下界去掉了。

问题转化为:有 \(m\) 个块,给每个块安排成平民或守卫,对于每一个平民,他离守卫的距离应该 \(\le R\)。

考虑 \(dp_i\) 表示钦定第 \(i\) 个块选成守卫,且保证其左边的块全部合法的最小代价。这个块的覆盖范围为 \([l_i-R,r_i+R]\),在 \(<l_i-R\) 的地方需要有另外的块来覆盖这些位置。找出满足 \(a_k<l_i-R\) 的最大 \(k\),然后从一个满足 \(r_j+R \ge a_k\) 的块 \(j\) 转移过来。每次转移枚举 \(j\),时间复杂度是 \(O(n^2)\) 的。

需要找一些性质来优化转移,发现满足条件的 \(j\) 始终是一个后缀 \([ptr,i-1]\),\(ptr\) 满足 \(r_{ptr}+R\ge A_k\),于是就可以使用指针维护 \(k,ptr\),就可以做到 \(O(n)\) 了。

merge

Lv 6.7

每次选取两个元素合并,这提示我们使用二叉树来分析。其中根结点为最终答案,每个叶子节点为元素,中间节点为合并的结果。接着通过样例模拟可以发现最终结果为 \(+1/-1\) 和 \(a_i\) 的线性组合还有一些 \(K\)。这个 \(K\) 很烦,尝试把它消掉,令 \(a_i^\prime=a_i+cK\),选取 \(x,y\) 合并后 \(z=K-x-y\),则 \(z^\prime=K-x-y-cK=(1-c)K-x-y\),把 \(x=x^\prime+cK,y=y^\prime+cK\) 带入得到 \(z^\prime=(1-3c)K-x^\prime-y^\prime\),令 \(c=\dfrac 13\) 就可以把这个 \(K\) 干掉,每次只需要考虑 \(x,y\) 的正负号就好了。设某个点的正负号为 \(s_i\),则答案可表示为:

\[F(K)=\sum_{i=1}^n s_i\left(a_i-\dfrac 13K\right)+\dfrac{K}{3} \]

接下来就变成决策结点正负号的问题了。

先不考虑 \(K\),先考虑 \(s_ia_i\)。设 \(m\) 为负号的叶子节点数量,剩下 \(n-m\) 全部正。若全部取正号,结果为 \(S=\sum_{i=1}^na_i\),取了一些负,答案变成 \(S-2\sum_{取负号的数} a_i\)。要让答案最大,应该选前 \(m\) 小的数取负号,将原数组排序,设前缀和为 \(P_m\),答案为 \(S-2P_m\)。最后把式子化简一下

\[F(K)=\sum_{i=1}^{n}s_{i}a_{i}+\frac{K}{3}\left(1-\sum_{i=1}^{n}s_{i}\right) \]

由于

\[\sum_{i=1}^{n}s_{i}=\left(n-m\right)-m=n-2m \]

则钦定了 \(m\) 的 \(F_m(K)\) 为

\[F_{m}(K)=S-2P_{m}+\frac{1-n-2m}{3}K \]

这里的 \(m\) 是不是可以任选?不是的,因为需要满足树的约束!

从只有叶子节点开始考虑,显然只有一个正号;考虑一个两个节点,就是一个两个负号……最后可以惊人地发现 \((n-2m) \bmod 3=1\) 这个结论。这个好像真的需要很强的注意力,还是当结论记吧……

然后就可以找出所有满足条件的 \(m\) 了。

接着考虑求出 \(F(K)\) 的最大值。不难发现 \(P_m\) 是单调不减的,整个式子可以看成直线方程,所以就维护一些凸包考虑交点就好了。但是我似乎不是这么想的。取 \(m_1<m_2\) 两个决策点,且 \(m_1\) 优于 \(m_2\),化简不等式 \(F_{m_1}(K)\ge F_{m_2}(K)\) 得

\[K\le \frac{3(P{m_2}-P{m_1})}{m_2-m_1} \]

这告诉我们当 \(K\) 小于这个临界值时,较小的 \(m_1\) 更优;\(K\) 大于临界值时,较大的 \(m_2\) 更优。

但是,任意两个决策点之间的这个临界值不太容易直接分析,所以我们继续缩小范围。

合法的 \(m\) 每次增加 \(3\),因此取 $ m_1=m,m_2=m+3. $

代入刚才的式子:

\[\begin{aligned} K &\le \frac{3(P{m+3}-P_m)}{3}\\\ &=P_{m+3}-P_m\\\ &=A_{m+1}+A_{m+2}+A_{m+3}. \end{aligned} \]

令 $T_m=A_{m+1}+A_{m+2}+A_{m+3} $

于是

\[F_m(K)\ge F_{m+3}(K) \iff K\le T_m \]

又因为 \(T_m\) 是单调不减的,相邻合法决策点之间的临界值单调不减。

随着 \(m\) 增大,

\[F_{m+3}(K)-F_m(K)=2(K-T_m) \]

由于 \(T_m\) 单调不减,右侧会随着 \(m\) 增大而单调不增。

因此,在所有合法的 \(m\) 中,\(F_m(K)\) 会先递增,再递减,或者中间出现相等的情况。

换句话说,我们不用枚举所有 \(m\) 找最大值,只需要二分查找最优决策的位置。

具体来说:

  • 若 \(K>T_m\),那么 \(F_{m+3}(K)>F_m(K)\),应该向更大的 \(m\) 移动。
  • 若 \(K<T_m\),那么 \(F_{m+3}(K)<F_m(K)\),应该停在较小的 \(m\) 一侧。
  • 若 \(K=T_m\),两个决策点的答案相同。

因此,建立临界值数组 \(T\),它本身已经有序。每次询问 \(K\),使用二分找出有多少个临界值满足 \(T_m\le K\),就能确定一个最优的 \(m\),再代入 \(F_m(K)\) 即可。时间复杂度 \(O((n+q)\log n)\)

R14

\(100+10+25+0\),T1 苦思冥想 2h 终于猜出结论(似乎是机房最后一个干掉这个的),T2 直接写了个广搜暴力,T3 也是直接按题意模拟写了个 \(O(mn\log n)\) 的暴力,但是我不会树链的做法,我只会特殊性质 A 的 \(O(n^2)\) 状物做法(但是这一档部分分只有 \(10^5\) 的范围啊),T4 不会。

game

Lv 4.?

神秘结论题,注意到每次翻转时,必然有且仅有一条与根相连的边被翻转了,且最终状态与根相连的边为全 \(0\)。因此翻转总次数的奇偶性为与根相连的边的权值和的奇偶性。所以只需要统计每个点连出去的 \(1\) 边的奇偶性即可。

这到底是怎么想出来这么神秘的结论的啊??????

赛时一直在考虑最优策略上了,所以踩了坑。我感觉 GPT 总结的挺有道理的,先放上来

我认为这道题真正有价值的地方,是一种常见的博弈题思考方式。

当一道题出现「每次操作翻转一条路径」时,可以按下面的顺序分析:

  1. 先找操作的共同结构。 所有被翻转的边看起来很多,但每条路径都有共同的起点——根。
  2. 寻找某个局部集合的变化规律。 根节点相邻的边虽然数量可能很多,却总有且仅有一条会在一次操作中翻转。
  3. 尝试取奇偶性,而不是具体数量。 每次翻转一条边,会让这些边权的异或和恰好翻转一次。
  4. 把终态与先前的变化联系起来。 游戏结束时 \(P=0\),于是初始的 \(P\) 直接决定了总操作次数的奇偶性。(其中根结点为 \(r\),\(P=\bigoplus_{u\sim r} w_{ru}\))
  5. 最后才考虑策略。 一旦所有合法操作都只能导致同一种胜负结果,就不再需要寻找最优策略。

这道题的关键转化可以概括为:

\[\boxed{ \text{路径翻转} \longrightarrow \text{根边奇偶性翻转} \longrightarrow \text{操作次数奇偶性} \longrightarrow \text{胜负确定} } \]

真正的难点是发现不变量,而不是证明最优策略。 当你发现每次操作都会让某个二进制量恰好翻转一次,而且终态强制这个量为 \(0\) 时,就应该立刻想到:总操作次数的奇偶性可能已经被初始状态决定了。

friends

Lv. 5.6,感觉理解了之后写起来很轻松的

有一个超级弱化版 https://www.luogu.com.cn/problem/P9310 先说这个弱化版的做法

对于区间类的问题有一个比较经典的分析思路,考虑相交 ([)]、相离 ()[]、包含 ([]) 三种情况,假设两个小括号的位置为 \(l_1,r_1\),两个中括号的位置为 \(l_2,r_2\),且 \(r_1-l_1>r_2-l_2\)。操作方案均为先让左括号走到右括号

  1. 相交:先走小括号再走中括号,走完一个之后就让他们滚蛋,然后操作次数为 \((r_1-l_1-1)+(r_2-l_2-1)-1\)(多减一个 \(1\) 是因为先走的滚蛋了);或者是先走中括号再走小括号,发现操作次数也是这个东西。
  2. 相离:显然不论如何走,答案都是 \((r_1-l_1-1)+(r_2-l_2-1)\)
  3. 包含:这里就要贪心一下了,先把被包含的中括号走了,然后再走小括号。

于是策略就出来了,直接让距离小的先走就是最优的,用一个树状数组维护一对 CP 中有多少个人跑路了就好了。

接着是这个版本,首先是不能让两个人滚蛋了(这个影响不大),其次是个环。然后破环成链也不好做。分析一下:如果是链上的话,只能左边走到右边,但如果是环上呢?可以是右边绕一圈回来和左边相遇啊?于是就变成了给区间 \(l_i,r_i\) 定向的问题了——左到右,需要移动 \(r_i-l_i-1\);右到左,需要移动 \(l_i-1+2n-r_i\)。

如果区间相交的话 [(]),先移动一个再移动另外一个,会省下一次的移动次数

所以就变成:区间的移动次数之和减去相交的区间个数

然后有一个经典结论:对于区间 \([L,R]\),

  1. 如果这个区间包含一个小区间,把 \([L,R]\) 反向之后就和小区间相离了
  2. 如果这个区间和另外一个区间相离,反向之后会变成包含
  3. 如果这个区间和另外一个区间相交,反向之后还是相交

然后就发现了:把区间换方向只影响“区间的移动次数之和”这个答案,对后面的“相交区间个数”没有影响,于是先用树状数组找原区间的相交个数,再对每个区间分别贪心即可。

R15

\(100+20+0+10=130\),T1 可以 30min 左右过掉大样例,后面就在坐牢死活想不出 T2

四个题全是原题是何意味啊。

erase

Lv 4.1

原题 https://www.luogu.com.cn/problem/P12690

直接贪,先删 A,B 然后再删 B,C,显然能删就删,从后往前考虑,记录 B 的数量然后扫到 A 且有剩余的 B 就匹配,B,C 同理

upkeep

Lv 4.8

原题 https://www.luogu.com.cn/problem/P9327

借鉴 Kruskal 的思想,对每一条边 \((u,v,l,c)\) 按照 \(l\) 从小到大排序,依次考虑点对 \(u,v\),若当前两点没有连通,这一条边就只能接上去;若当前两点已经连通,且这条边的边权比当前的最短路还小,说明这条边是必要的(加入后某些点对的最短路会变小),所以要加上去,否则可以不用加。

posted @ 2026-10-07 21:55  wwwidk1234  阅读(14)  评论(0)    收藏  举报