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 \times \sum_{i=1}^{\log n} 2^{i/2} = O(n\sqrt n) \]

(证明这个式子用等比数列求和即可)。

当然这还远远不够,因为此题的 \(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_i = F_{i-2} + xF_{i-1} \]

其中 \(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}\),进一步发现,递归下去做类似计算,总答案和可以表示为:

\[\sum\limits_{i=1}^n fib_{n-i} F_{i-1}F_{i-2} \]

\(fib\) 是斐波那契数列,其中 \(fib_0 = fib_1 = 1\)

引入另一个变量 \(y\)(感觉自己推式子能力还是弱,这就是我的局限性了),设:

\[G = \sum\limits_{i=0}^{+\infty} y^i F_i F_{i-1} \]

再代入斐波那契的生成函数,得到答案可以表示为:

\[[x^{d-1}y^{n-1}] \dfrac{G}{1-y-y^2} \]

\(G\) 的封闭形式是可以求的(这个我场上想到了),只需要设:

\[G^{\prime} = \sum\limits_{i=0}^{+\infty} y^i F^2_{i-1} \]

\(G\)\(G^{\prime}\) 中的 \(F_{i}\) 分别展开可以得到二者之间的关系。

\[\begin{align*} \begin{cases} G = 1 + xG^{\prime} -x + y G \\ G^{\prime} = 1 + y + yx^2(G ^{\prime} - 1) + y^2 G^{\prime} + 2xy^2 G \end{cases} \end{align*} \]

解方程可以得到:

\[G = \dfrac{1 + xy + xy^2 - y^2 - x^2y}{(1+y)((1-y)^2 - x^2 y)} \]

分子项数比较少,可以直接枚举,现在需要求的是:

\[[x^a y^b] \dfrac{1}{(1-y-y^2)(1+y)((1-y)^2 - x^2 y)} \]

分母只有 \(x^2\) 项,可以分讨 \(d-1\) 的奇偶性,进一步变为求:

\[[x^a y^b] \dfrac{1}{(1-y-y^2)(1+y)((1-y)^2 - x y)} \]

其中 \(a\) 比较小,\(b\) 很大。

先把 \(\dfrac{1}{(1-y)^2 - x y}\) 拆开,得到:

\[\begin{aligned} [x^a]\dfrac{1}{(1-y)^2-xy}&=[x^a]\dfrac{\frac{1}{(1-y)^2}}{1-\frac{xy}{(1-y)^2}}\\ &=\dfrac{1}{(1-y)^2} \cdot [x^a]\sum_{i=0}^{+\infty} (\dfrac{xy}{(1-y)^2})^i\\ &=\dfrac{y^a}{(1-y)^{2a+2}} \end{aligned} \]

现在变为求:

\[[y^{b-a}] \dfrac{1}{(1+y)(1-y-y^2)(1-y)^{2a+2}} \]

\(m = 2a+2\),首先得到:(为什么这样想??)

\[\dfrac{1}{(1+y)(1-y-y^2)}=\dfrac{y}{1-y-y^2}+\dfrac{1}{1+y} \]

那原式就被分成两个部分,前半部分去掉分子之后,组合意义相当于 \(fib\) 序列做 \(m\) 次前缀和。

一个序列 \(a_i = fib_{l+i}\),做完前缀和之后有 \(a_i = fib_{l+i+2} - fib_{l+1}\)。推几下式子之后可以得到:

\[[y^t]\dfrac{1}{(1-y-y^2)(1+y)^m} = fib_{t+2m} - \sum_{i=1}^{m} fib_{2i - 1} \cdot [y^t]\dfrac{1}{(1-y)^{m-i+1}} \]

也就是:

\[[y^t]\dfrac{1}{(1-y-y^2)(1+y)^m} = fib_{t+2m} - \sum_{i=1}^{m} fib_{2i - 1} \cdot \binom{t+m-i}{m-i} \]

这一部分第一个 \(fib\) 矩阵快速幂,后面的组合数可以递推。

再看后面一个部分,我们继续使用前面类似的方法:

\[\dfrac{1}{(1+y)(1-y)} = \dfrac{1}{2} ( \dfrac{1}{1-y} + \dfrac{1}{1+y}) \]

就这样一直分下去,可以得到:

\[\dfrac{1}{(1+y)(1-y)^m} = \dfrac{2^{-m}}{1+y} + \sum\limits_{i=1}^{m}\dfrac{2^{-(m-i+1)}}{(1-y)^i} \]

所求即为:

\[[y^t]\dfrac{1}{(1+y)(1-y)^m} = \dfrac{(-1)^t}{2^m} + \sum\limits_{i=0}^{m-1}\dfrac{\binom{t+i}{i}}{2^{m-i}} = \dfrac{1}{2^m}((-1)^t+\sum_{i=0}^{m-1} 2^i\binom{t+i}{i}) \]

总时间复杂度 \(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\) 的数以及匹配情况。

1

容易发现,上述操作恰好使用了 \(3K+1\) 个数,因此可以解决 \(N \bmod 3 \not= 0\) 的情况。

对于 \(N \bmod 3=0\) 的情况,需要分两种子情况考虑。

第一种是 \(\frac N3 \bmod 2=1\),首先把 \(N=15\) 的情况特判掉,剩下的情况可以使用下图的构造解决(图中所示 \(K=13\) 的情况):

2

上图的构造分为三部分(绿色、蓝色、黄色都是同一组匹配,可以看做是具有相邻且包含的匹配组):

  • 绿色部分,涵盖了差为 \(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\) 的情况):

3

上图的构造分为三部分(绿色、蓝色、黄色都是同一组匹配,可以看做是具有相邻且包含的匹配组):

  • 绿色部分,涵盖了差为 \(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)\)

posted @ 2026-06-17 23:05  KIreteria  阅读(49)  评论(1)    收藏  举报