2026 山东三轮省集
Day 0
Day 1
\(100 + 50 + 0\)。
T1
考虑直接递推,同时存下 \(f_i,f_{i/2},f_{i/4},f_{i/8},\dots,f_{i/2^{60}}\)(都是下取整)。
从 \(i-1\) 推到 \(i\) 时,\(f_{i/{2^k}}\) 只会在 \(i\) 是 \(2^k\) 的倍数时才会变化。因此转移矩阵只有 \(\log n\) 种。
设 \(2^k \mid i\) 时的转移矩阵是 \(M_i\),则所求即为 \(\prod\limits_{i=1}^{n} M_i\)。
设 \(P_k = \prod\limits_{i=1}^{2^k} M_i\),\(P_k\) 可以递推,即 \(P_k = \prod\limits_{i=k-1}^{0} P_i \times M_{2^k}\)。
求答案的时候只需要进行 \(\log n\) 次向量乘矩阵,时间复杂度 $T \log^3 n $。
T2
CF1039D 的加强版。
设 \(d_x\) 是 \(x\) 向下伸出的最长链长度。
考虑怎么对单独一个 \(k\) 求答案,一个贪心的方法是,自底向上考虑,如果以当前点 \(x\) 为根能组成的链长度 \(\ge k\),也就是儿子中 \(d_y\) 的最大值和次大值之和 \(\ge k\),就给答案加一,并把整个子树删掉(将 \(d_x\) 设为 \(0\))。容易 DP 解决,复杂度 \(O(n)\)。
根据 \(k\) 的答案 \(\le \dfrac{n}{k}\) 的性质,我们可以使用经典方法:对 \([1,n]\) 这个区间分治,分治到区间 \([l,r]\) 的时候,如果 \(l,r\) 的答案相同就直接退出,可以证明这样的复杂度是 \(O(n\sqrt n)\) 的。
复杂度证明
写一下。
考虑这个分治结构(也就是线段树)的第 \(d\) 层,一共有 \(2^d\) 个节点,每个节点的长度是 \(\dfrac{n}{2^d}\)。考虑前 \(2^{d/2}\) 个节点之后的节点,也就是 \(k \ge \dfrac{n}{2^d} \times 2^{d/2} = \dfrac{n}{2^{d/2}}\) 的位置,这些位置只有至多 \(\dfrac{n}{k} = 2^{d/2}\) 种值,递归到这一层的区间也只有 \(O(2^{d/2})\) 个,因此第 \(d\) 层的总区间数量是 \(O(2^{d/2})\)。复杂度就是:
(证明这个式子用等比数列求和即可)。
当然这还远远不够,因为此题的 \(n\) 有 \(10^6\) 之多,我们抛弃根号做法。考虑如何高效的求出所有答案。
这个题有很多做法,包括我乱想出来的 \(O(n\log^3 n)\) 的没用的东西,还有周神的长剖做法,CF 博客上面的 \(O(n\log n)\) 做法等等。这里只记一下比较好想的 \(O(n\log^2n)\) 做法。
把所有 \(k\) 放在一起算,设 \(f_{i,k}\) 为某个 \(k\) 时 \(i\) 节点向下的最大深度。发现 \(k > size_i\) 的时候 \(f_{i,k}\) 一定是 \(d_i\)。
对树做重链剖分,\(f_i\) 直接继承轻儿子,设 \(S\) 是轻儿子 \(size\) 的最大值,则 \(k \le 2*S\) 的部分可以暴力转移,只需记录该位置上的轻儿子 \(f\) 的最大值和次大值,所有轻儿子 \(size\) 之和为 \(O(n\log n)\)。
设 \(D\) 是所有轻儿子的 \(d_y\) 的最大值,对于 \(k > 2*S\),唯一可能的转移就是 \(D\) 的贡献。我们每条重链开线段树维护 \(f\) 值,如果说 \(D + f_{x,k} \ge k\) 那么 \(k\) 的答案就会加一,因此我们维护 \(f_{x,k} - k\) 的最大值,这样就可以快速判断区间中有没有满足条件的位置,因为答案总和是 \(O(n\log n)\) 的,因此这部分复杂度也是 \(O(n\log ^2 n)\)。
若一个区间中没有满足条件的位置,只需区间对 \(D\) 取 \(\max\),容易打 tag 维护。需要注意线段树上区间 \([l,r]\) 的 \(\max\) 值是对 \(D-l\) 取的 \(\max\)。
继承轻儿子的时候要全局 \(+1\) ,同样打 tag 维护,代码不大好写。
T3
线性规划学习中……
Day 2
\(100 + 80 + 0\),T2 全是乱搞分数。
T1
去年三轮出过。这是当时写的题解:
一个一个把人加进去,设 \(t_i\) 表示当前 \(i\) 点最后有人的时间为 \(t_i\)。
令 \(t_i = t_i - dep_i\),这样我们便不用考虑在边上移动花费的时间。
插入一个点 \(x\),相当于给 \(x\) 点到根路径中的所有点 \(i\) 自上向下做如下操作:
- \(t_i = t_{fa_{i}} = \max(t_i,t_{fa_{i}})\)
然后对于所有点 \(i\):
- \(t_i = t_i + 1\)
然后 \(t_x = t_x + a_x\)。
这个东西如果你先重链剖分,并且只看重链上的前缀最大值(其他值对统计答案没有用处),就可以看作前缀最大值全部向上移动一格,再全部 \(+1\),然后单点修改一次。直接用平衡树暴力维护,类似 P9999。时间复杂度 \(O(n \log ^2 n)\)。
T2
我很久很久以前做过,早就忘了。
赛时题面把原题的白嫖换成了半价,本质是相同的。
把物品的价值从大到小排序。价值相同的分成一组,一组一组地考虑。
用优先队列存下前面白嫖过的所有物品,方便后面反悔。并且记 \(now\) 为当前还有几次白嫖机会。
考虑新的一组的时候,一开始肯定是能白嫖就白嫖,机会用完了考虑反悔:
设当前白嫖过的物品价值最小时 \(k\),当前物品价值是 \(s\),分讨:
-
\(s>k\),可以买 \(k\),并白嫖两个 \(s\)(只有一个 \(k\) 就只白嫖一个)。也就是删掉 \(k\),加入两个 \(s\)。
-
\(s<k\),可以做和上面一样的操作,也可以不做。考虑往队列里加入一个 \(2s-k\)(只剩下一个 \(s\),或者 \(2s<k\) 则不加入。),发现这样可以覆盖所有的操作:
- 首先要知道 \(2s-k < k\) 因此一定先选 \(2s-k\) 再选 \(k\)。
- 选 \(2s-k\) 相当于 \(s>k\) 的那个操作。
- 两个都选相当于不白嫖 \(s\),把两个 \(s\) 留给后面的操作。
这很诡异,但是是对的。
T3
令三元组 \((x,y,z)\) 是关键的当且仅当 \(a_i,b_j,c_k\) 在 \(a[1:i],b[1:j],c[1:k]\) 构成的可重集中都只出现了恰好一次。考虑 \(n/3\) 个构成偏序关系的关键三元组。发现能找出这 \(n\) 个三元组和 \(a,b,c\) 合法是等价的,并且一个合法的 \(a,b,c\) 只会对应唯一的这一组。也就是每一轮三人吃的寿司的位置。
考虑以这个东西为结构进行 DP。我们先研究一些性质:如果存在三元组 \((i,j,k)\),说明 \(c_k\) 在 \(a,b\) 中 分别出现在 \(i,j\) 之后,\(a_i,b_j\) 在 \(c\) 中出现在 \(k\) 之后。对于其他的数则没有限制。
设 \(f_{t,i,j,k}\) 为考虑了后 \(t\) 组,倒数第 \(t\) 组在 \((i,j,k)\) 时,后 \(t\) 组的 \(3t\) 个数在 \(c\) 中排列的方案数。\(a_i,b_j\) 都在 \(k\) 之后,因为是倒着 DP,所以之前填的数都在 \(k\) 之后,恰好有 \(3(t-1)\) 个。因此这部分的系数可以直接算,后面是计算 \(c_k\) 的种类数,\(c_k\) 除了应该和已经填在 \(c\) 中的数不同之外,还应和 \(a[1:i-1] \cap b[1:j-1]\) 中的任意数不同,我们发现这两部分是不交的!(由关键三元组的定义可知)。因此直接把这两部分相加就可以得到系数。答案就是 \(f_{n,1,1,1}\)。
直接 DP 复杂度非常高。进一步发现系数之和上一个状态无关,可以前缀和优化到 \(O(n^4)\)。又发现包含 \(i,j\) 的系数和 \(k\) 的系数完全是独立的,因此可以分别转移再直接乘起来。时间复杂度 \(O(n^3)\)。
Day 3
\(100 + 25 + 0\)。。。
T1
很快就想到了,不知道为什么。
如果确定了权值集合,那么答案就是前 \(\left\lfloor\dfrac{n-1}{2}\right\rfloor\) 大的权值和减去前 \(\left\lfloor\dfrac{n-1}{2}\right\rfloor\) 小的权值和。发现这个问题非常的困难。
我们称一棵生成树的“\(k\) 权值”是边集中前 \(k\) 大的权值和减去前 \(2\left\lfloor\dfrac{n-1}{2}\right\rfloor - k\) 小的权值和,设 \(f(k)\) 是“\(k\) 权值”最大的一棵生成树的权值,可以证明 \(f(k)\) 是凸的。
本题所要求的就是 \(f(\left\lfloor\dfrac{n-1}{2}\right\rfloor)\)。
那么直接 wqs 二分,二分一个斜率 \(k\),如果一条边想要被分到正数一组那么权值是 \(z - k\),否则为 \(-z\)。取其中较大的一个跑最大生成树即可。
T2
我们认为图中没有环,出现环就可以认为是无限大的一张图,这样我们只考虑向下延伸的树就可以涵盖所有结构。
当 \(m\) 是 \(2\) 的整次幂的时候。将叶子按比例分配即可,如果一棵子树全部属于一个 \(i\),那么可以在根处就退出,设 \(\dfrac{a_i}{m}\) 的二进制小数表示是 \(\sum b_{i,j}*2^{-j}\),那么答案就是 \(\sum b_{i,j}*2^{-j}*j\)。
感觉这题最难的地方就在于发现这个东西本质是小数表示。
在 \(m\) 不是 \(2\) 的整次幂时,同样直接把 \(\dfrac{a_i}{m}\) 的无限小数表示列出,答案即为 \(\sum\limits_{j=0}^{\infty} b_{i,j}*2^{-j}*j\)。设其为 \(f(\dfrac{a_i}{m})\)。这个东西是收敛的。
直接求 \(f\) 比较麻烦,然后我们可以惊人的注意到 \(f(\left\{2x\right\}) = 2f(x) - 2x\)(花括号即为求小数部分,也就是 \(\bmod 1\))。也就是说 \(f(\dfrac{x}{m})\) 和 \(f(\dfrac{2x\bmod m}{m})\) 之间有转移关系。这样 \(m\) 个 \(f(x)\) 之间的转移就构成基环树森林。在环上消元就可以把所有的 \(f(\dfrac{x}{m})\) 求出来。时间复杂度 \(O(n+m)\) 或者 \(O(n + m\log P)\)。
T3
很困难,以为是数据结构但是实际上并不是。
没有 + 的时候怎么做?当然可以用线段树维护所有操作,这里有一个更简单,复杂度更低的做法:
首先 & 和 | 操作相当于给一些位置覆盖,假设询问区间为 \([L,R]\),若 \([L,R]\) 中没有覆盖操作那直接求出异或和,否则找到 \(pre_{t,R}\) ,也就是第 \(t\) 位上 \(R\) 之前最后一个覆盖操作,求得 \([pre_{t,R},R]\) 的异或和即可。
考虑 + 的操作和异或唯一的区别在于这个东西会进位。于是我们考虑对于第 \(t\) 位,什么时候会造成进位的影响。
设 \(f_{t,i}\) 表示 \([0,t-1]\) 位全是 \(0\) 时,从第 \(i\) 个操作开始做,找到的第一个 \(+1\) 操作使得做到这个操作时 \([0,t-1]\) 再一次变为全 \(0\),也就是第一个对第 \(t\) 位造成影响的 \(+1\) 操作。没有则为 \(+\infty\)。再设辅助数组 \(g_{t,i}\) 表示 \([0,t-1]\) 位全是 \(0\) 并且第 \(i\) 位是 \(1\) 时,从第 \(i\) 个操作开始做,找到的第一个 \(+1\) 操作使得做到这个操作时 \([0,t]\) 变为全 \(0\)。这两个数组容易互相转移全部推出。
询问的 \(v,l,r,t\) 时候设当前 \(\text{lowbit}\) 的位置是 \(p\),当 \(p<t\) 时不断跳到 \(g_{p,l}+1\) 使得 \(\text{lowbit}\) 变大,这一步是 \(O(\log V)\) 的,到最后 \([0,t-1]\) 这些位全部清零,就可以用 \(f\) 进行转移:每跳一次 \(f\) 就相当于 + 对第 \(t\) 位造成一次影响。也就是相当于进行一次异或。因此我们只需要算出从最后一次覆盖跳 \(f\) 跳到 \(r\) 一共跳了几次就可以了,用树剖解决。时间复杂度 \(O((n+q)\log V)\)。
Day 4
\(100 + 25 + 36\)。。
T1
赛时做法太诡异了,正解还没学会。
T2
行覆盖用 ODT 维护,现在修改只有插入和撤销。
以列为外层,行为内层建树套树。类似于树套树做矩形加矩形求和,对每一个查询的节点,分讨对询问造成贡献的修改的节点在其子树内还是外。容易转化成修改/查询时,对遍历过的所有节点做一个操作,对末端的节点做另一种操作,操作是单点取 \(\max\)/撤销,区间查 \(\max\),可以在叶子上维护 \(\text{set}\) 或者懒惰删除的优先队列。做到 \(O(\log n)\) 一次操作,时间复杂度 \(O(n\log^2 n)\)。
直接做空间也是 \(O(n\log ^2n )\) 的。考虑离线,把每个外层线段树节点要做的操作全部按顺序存下来。最后一个节点一个节点的做。空间就变成了 \(O(n\log n)\)。
T3
设 \(T_i\) 是 \(i\) 次操作后的树,\(T_0\) 是一个单点。
手玩可以知道 \(T_i\) 是 \(T_{i-2}\) 下面接一棵 \(T_{i-1}\) 得到的。
设 \(f_{i,j}\) 是 \(T_i\) 中深度为 \(j\) 的节点个数,其生成函数是 \(F_i\),容易得到以下式子:
其中 \(F_0 = 1,F_1 = x+1\),令 \(F_{-1} = 1\) 使得 \(F_1\) 也满足上述式子。
\(T_i\) 中经过拆出来的 \(T_{i-1},T_{i-2}\) 两棵子树的边的路径数量为 \([x^{d-1}]F_{i-1}F_{i-2}\),进一步发现,递归下去做类似计算,总答案和可以表示为:
\(fib\) 是斐波那契数列,其中 \(fib_0 = fib_1 = 1\)。
引入另一个变量 \(y\)(感觉自己推式子能力还是弱,这就是我的局限性了),设:
再代入斐波那契的生成函数,得到答案可以表示为:
\(G\) 的封闭形式是可以求的(这个我场上想到了),只需要设:
将 \(G\) 和 \(G^{\prime}\) 中的 \(F_{i}\) 分别展开可以得到二者之间的关系。
解方程可以得到:
分子项数比较少,可以直接枚举,现在需要求的是:
分母只有 \(x^2\) 项,可以分讨 \(d-1\) 的奇偶性,进一步变为求:
其中 \(a\) 比较小,\(b\) 很大。
先把 \(\dfrac{1}{(1-y)^2 - x y}\) 拆开,得到:
现在变为求:
设 \(m = 2a+2\),首先得到:(为什么这样想??)
那原式就被分成两个部分,前半部分去掉分子之后,组合意义相当于 \(fib\) 序列做 \(m\) 次前缀和。
一个序列 \(a_i = fib_{l+i}\),做完前缀和之后有 \(a_i = fib_{l+i+2} - fib_{l+1}\)。推几下式子之后可以得到:
也就是:
这一部分第一个 \(fib\) 矩阵快速幂,后面的组合数可以递推。
再看后面一个部分,我们继续使用前面类似的方法:
就这样一直分下去,可以得到:
所求即为:
总时间复杂度 \(O(d + \log n)\)。
Day 5
\(100 + 44 + 30\)。
T1
立方体的八个角确定了,方案数就很容易算出。
进一步地,可以枚举立方体互相不相邻的四个角。另外四个角就是独立的了,可以预处理一个角的系数,时间复杂度 \(O(\left| \Sigma \right|^4)\)。
T2
可以证明只会走一条非树边。
考虑如果起点是 \((s,t)\),终点是 \((u,v,w)\) 时,答案就是 \(2(n-1)-d(s,t)-d(u,v)+w-2*\max(len-1,0)\) 其中 \(len\) 是 \((u,v),(s,t)\) 交的长度。
点分治,处理跨过中心的 \((u,v,w)\),任意 \((s,t)\) 的贡献可以通过一些 DP 得到,需要分讨和 \((u,v)\) 无交,有交且不跨过根,有交且跨过根的情况。如果有节点在根上还需要进行一些特判。。DP 的时候可能要维护前 \(4\) 大值。
点分治到子树大小 \(< \lceil\dfrac{n}{3}\rceil\) 的时候就不用递归了,因为 \(w 7\ge d(u,v)\) 的边毫无意义。
点分治向下递归会很麻烦,因为 \((s,t)\) 可能在分治子树的外侧。但是我们发现点分治的分治层数,分☞中心数量都是 \(O(1)\) 的。进一步的说,只有 \(3\) 个。因此我们完全可以先找到这三个中心,在跑三次上述算法即可,时间复杂度 \(O(n)\)。
这也说明了取 \(O(k)\) 个点可以覆盖所有长度 \(> \lceil\dfrac{n}{k}\rceil\) 的路径。
T3
Day 6
什么都不会。
T1
这是题?
经过一堆感受,证明(瞎猜),可以知道第 \(i\) 个位置最终的数只可能是 \([i-2,i+2]\) 中的某个 \(a_x - 1,a_x,a_x + 1\)。这样一个位置只有 \(O(1)\) 种取值,直接 DP,时间复杂度 \(O(n)\)。
T2
首先可以 \(n^2\) DP。
对串长根号分治,串长小于阈值的用哈希或者 Trie 树暴力转移。
对剩下的串正串反串建 SA,以便 \(O(1)\) 求 lcp 和 lcs。
串长大于阈值的时候,考虑如果转移的是后缀,那么有 \(dp_i = \max_{j>i-lcp}{dp_j} + w\)。也就是区间查 \(\max\),单点修改,同理转移前缀的时候相当于区间取 \(\max\) 单点查询。这两个可以用分块平衡做到 \(O(n\sqrt n)\)。
当然我们发现这两个操作由于查询的左端点单调递增,可以用 ST 表维护,具体实现可以看看当时写的代码。这部分复杂度可以优化到 \(O(n\log n)\),总的复杂度没有变化。
T3
Day 7
\(100 + 50 + 0\)。
T1
将 RGB 对应到 012,可以发现所有位置的总和 \(\bmod 3\) 是不变的。这也是有解的充要条件。
发现操作是可逆的,相当于我们一次可以操作 \(a\) 也可以操作 \(b\)。
将原序列分成极小的段,使得每一段中 \(\bmod 3\) 意义下 \(a\) 的和等于 \(b\) 的和。设一段长度为 \(len\),这一段的最小答案显然是 \(len-1\),否则可以被分成更小的段。最大答案是 \(len\),从左往右直接操作,除了最后一次,每次总有一种方式(调整 \(a\) 或 \(b\))使得两者第一位相等,否则可以被分成更小的段。有了这个结论我们就知道段之间肯定没有操作。
这样我们只需要对每一段判断这一段能不能在 \(len-1\) 次操作内完成,每个位置一定都会被操作恰好一次。也就是我们需要找到一个排列使得操作完之后 \(a\) 变成 \(b\)。
对于 \((i,i+1)\) 这个操作,考虑 \(i\) 之前的 \(a\) 的和与 \(i+1\) 以及后的 \(a\) 的和,发现这两个东西只可能因为这一个操作而改变,设二者分别是 \(x,y\),这个操作能做的就是把 \(x,y\) 变成 \(x+1,y-1\),或者 \(x-1,y+1\)。当 \(a_i = a_{i+1}\) 的时候,这两种变化都可以实现,否则只能实现其中一个。这样我们就有若干限制,也就是说 \((i,i+1)\) 这个操作和 \((i-1,i)\) 与 \((i+1,i+2)\) 之间相对关系之间的限制。只有相邻的操作有限制,而第一个操作只有右边一个限制,因此我们可以从左向右考虑,可以证明一旦一个操作不受任何限制,那么后面一定有解,也就是答案一定是 \(len-1\),否则这个操作怎么操作是确定的,可以顺着推下去,没有任何 DP,时间复杂度 \(O(n)\)。
T2
想不大清楚,先不写了。
T3
好困难的构造。
Day 8
\(100 + 20 + 40\)。
T1
直接以每个点为根的方案数,会算重。感受一下合法的根是连通块,可以点减边。
直接换根复杂度 \(O(n^3)\),非常不牛。但是我们发现其实我们的 DP 数组几乎是无用的,如果我们要求答案,只需要用到 DP 数组的其中一项。也就是不需要卷积。因此向儿子递归的时候我们只需要把背包退掉,对于从父亲来的贡献不需要做完整的卷积,直接计算答案就可以了。时间复杂度 \(O(n^2)\)。
T2
令两个人相遇的点为关键点,关键点之间都是祖孙关系。
两个相邻关键点 \(x,y\) 之间的贡献,走法肯定是一个点先去把 \(x\) 子树外所有叶子都走一下,最后一个人往 \(x\) 走,另一个人往另一个叶子走,最后另一个人传送回 \(x\),这样我们可以看出最深叶子浅于 \(x\) 是毫无意义的,因为这样不如提前传送回来让 \(x\) 的一个祖先成为关键点。因此 \((x,y)\) 应该满足 \(y\) 字数内 \(x\) 子树外最深的叶子深于 \(x\),贡献就是所有叶子到 \(y\) 的距离和。可以 \(O(n^2)\) DP。
接下来注意到,对于一个 \(x\),其对应的 \(y\) 只有可能是满足上述条件的最深的 \(y\)。因为如果 \((x,z)\) 合法,\((x,y)\) 合法,那 \((y,z)\) 肯定合法,这样如果最终走法里面存在相邻 \((x,z)\),中间插入 \(y\) 答案不会变劣。现在问题转化成了对每个 \(x\) 找到对应的 \(y\),然后只要 DP 转移就可以了。
考虑从下往上合并,每个子树内有一些长链上的点还没找到对应的祖先,这些点用链表维护一下,两个子树合并只需要删掉一些点就好了。时间复杂度 \(O(n)\)。
T3
懒了,直接复制出题人题解。。
考虑先不构造方案,把最多删除多少个数算出来,首先答案的上界显然是 \(\lfloor \frac N3 \rfloor\),但是当 \(N \bmod 3=0\) 的时候,要求 \(1 \sim N\) 的总和是偶数,即 \(\frac{N(N+1)}{2} \bmod2 =0\) 才可以删空,如果不满足总和是偶数一定会少构造一组,这个时候当做 \(N\) 减去了 \(1\) 构造即可。
那么显然有三种情况,\(N \bmod 3=0 \And \frac{N(N+1)}{2} \bmod 2=0,N \bmod 3 =1,N \bmod 3 =2\),接下来我们会通过构造证明上述上界一定可以达到。方便起见,以下设 \(K = \lfloor \frac{N}{3} \rfloor\)。
对于所有情况,显然有 \(1 \sim K\) 一定都是作为 \(X\) 出现(这句话出现在出题人题解里面,但是其实是错误的,但是这么做确实可以构造出一组解),而 \(K+1 \sim N\) 一定都是作为 \(Y,Z\) 出现,因此问题等价于在 \(K+1 \sim N\) 中找 \(K\) 组匹配,使得第 \(i\) 组匹配的差值为 \(i\)。
对于 \(N \bmod 3 \not= 0\) 的情况,因为可以多一个数出来,操作空间较大,此处给出一种简单的构造:
- 第一组,造出所有 \(1 \sim K\) 中奇数作为 \(X\) 的情况,如下图黄色部分的匹配。
- 第二组,造出所有 \(1 \sim K\) 中偶数作为 \(X\) 的情况,如下图绿色部分的匹配(这里的红色点需要作为一个占位符,所以多了一个数出来)。
注:图中以 \(K=9\) 为例,省略了 \(1 \sim K\) 中的数,只画出了 \(K+1 \sim N\) 的数以及匹配情况。

容易发现,上述操作恰好使用了 \(3K+1\) 个数,因此可以解决 \(N \bmod 3 \not= 0\) 的情况。
对于 \(N \bmod 3=0\) 的情况,需要分两种子情况考虑。
第一种是 \(\frac N3 \bmod 2=1\),首先把 \(N=15\) 的情况特判掉,剩下的情况可以使用下图的构造解决(图中所示 \(K=13\) 的情况):

上图的构造分为三部分(绿色、蓝色、黄色都是同一组匹配,可以看做是具有相邻且包含的匹配组):
- 绿色部分,涵盖了差为 \(2 \sim K-1\) 的所有偶数匹配,最后剩下中间那一个。
- 绿色部分中间的那一个连向右侧 \(K\) 个点的中点,构成差为 \(K\) 的匹配。
- 蓝色部分,涵盖了差为 \(\frac{K+1}{2} \sim K-2\) 的所有奇数匹配。
- 次长的红色匹配差为 \(\frac{K-3}{2}\)。
- 黄色部分(\(K=13\) 的时候只有一条,\(K\) 较大的时候仍然有多条),涵盖了差为 \(3 \sim \frac{K-7}2\) 的所有奇数匹配。
- 最短的红色匹配差为 \(1\)。
可以证明上述匹配一定合法,即不会有公用点。
第二种是 \(\frac N3 \bmod 2=0\),首先把 \(N=12\) 的情况特判掉,剩下的情况可以使用下图的构造解决(图中所示 \(K=16\) 的情况):

上图的构造分为三部分(绿色、蓝色、黄色都是同一组匹配,可以看做是具有相邻且包含的匹配组):
- 绿色部分,涵盖了差为 \(2 \sim K\) 的所有偶数匹配,最后剩下中间那一个。
- 绿色部分中间的那一个连向右侧 \(K\) 个点的靠左的中点,构成差为 \(K-1\) 的匹配。
- 蓝色部分,涵盖了差为 \(\frac{K}{2}+1 \sim K-3\) 的所有奇数匹配。
- 次长的红色匹配差为 \(\frac{K}{2}-1\)。
- 黄色部分,涵盖了差为 \(3 \sim \frac{K}2-3\) 的所有奇数匹配。
- 最短的红色匹配差为 \(1\)。
因此,我们完成了构造性证明,整个构造的时间复杂度为 \(O(N)\)。

浙公网安备 33010602011771号