2026 省选集训 Final 做题记录

2026 省选集训 Final 做题记录

2026 寒假作业 - Virtual Judge

Kids And Sequence Game

题意相当于给定 \(n\) 个栈,两人博弈每次取任意一个栈顶的元素,要使得得分尽量大。

一个重要的观察是,栈内的值就算不是 01 也是可做的。

先考虑一种简单的情况,对于每个栈栈内的权值从顶部递减,此时最优策略就是每次取最大的。

反之假如有两个连续元素 \(x<y\),那么如果先手取了当前最优的 \(x\),那么 \(y\) 也将是当前最优,于是后手会选 \(y\),这样一轮后先手顺序不变而先手获得了负的贡献。由于先手获得负的贡献,那么先手取 \(x\) 的目的一定是要取 \(y\) 的下一个元素 \(z\),所以我们可以把 \(x-y+z\) 合并成一个元素。

而如果此时 \(y\) 就是最后一个元素,那么 \(x,y\) 一定是最后选,我们把贡献累加起来,并把栈清空。

我们用栈模拟上述过程,将原来的元素按顺序加入栈中,要注意合并的过程是递归实现的。

那么最后所有栈都是从顶部递减的,再跑一开始的算法即可,只需对所有剩余元素排一次序。

abc446_g 221 Subsequence

这道题两处读错题,一处以为是连续子序列;另一处是没看到最后一句话,以为位置不同就算不同。

我们设 \(f_i\) 表示前 \(i\) 个数能构成的种类数。

考虑当前值 \(v\),如果已有 \(\ge v\) 个,那么找到当前倒数第 \(v\) 个值 \(v+1\) 的位置 \(x\)(没有则为 \(0\)),与倒数第 \(v\) 个值 \(v\) 的位置 \(y\)

那么 \(f_{y-1}-f_x\) 就是能与这 \(v\)\(v\) 构成新种类的数量,可以保证不重不漏。记得如果第一次出现 \(v\)\(v\) 还要再加一。

复杂度线性。

Planting Trees

题意:多次询问求

\[\sum _{i=0}^{n-1} [(f\times i+x)\bmod m<(g\times i+y)\bmod m] \]

结论:\([x\bmod m<y\bmod m]=\lfloor\frac xm \rfloor-\lfloor \frac ym\rfloor-\lfloor \frac {x-y}m\rfloor\)

证明:

\(x=pm+r,y=qm+t\),其中 \(0\le r,t<m\)

\(x\bmod m <y\bmod m\)\(r<t\) 充要。

  • \(r<t\) 时,\(r-t<0\),则 \(\lfloor \frac {x-y}m\rfloor=\lfloor (p+q)m+(r-t)\rfloor=p+q-1\)
    则右式等于 \(p+q-(p+q-1)=1\)
  • 否则 \(r\ge t\),则 \(\lfloor \frac {x-y}m\rfloor=\lfloor (p+q)m+(r-t)\rfloor=p+q\)
    则右式等于 \(0\)

证毕。

于是套用类欧几里得算法即可,注意 \(a,b\) 为负数时类欧的实现方式(参考 atcoder 库):

long long floor_sum(long long n, long long m, long long a, long long b) {
    assert(0 <= n && n < (1LL << 32));
    assert(1 <= m && m < (1LL << 32));
    unsigned long long ans = 0;
    if (a < 0) {
        unsigned long long a2 = safe_mod(a, m);
        ans -= 1ULL * n * (n - 1) / 2 * ((a2 - a) / m);
        a = a2;
    }
    if (b < 0) {
        unsigned long long b2 = safe_mod(b, m);
        ans -= 1ULL * n * ((b2 - b) / m);
        b = b2;
    }
    return ans + floor_sum_unsigned(n, m, a, b);
}

[USACO26 3rd G] Good Cyclic Shifts

只需快速求出所有循环位移的 \(f(p)\) 和逆序对个数即可。

前者我们对于每个值考虑对所有循环位移的贡献,形如三段一次函数,打差分即可。

逆序对个数也是容易的。

复杂度 \(O(n\log n)\),瓶颈在求一开始的逆序对个数。

[USACO26 3rd G] Picking Flowers

考虑魔改一下最短路的状态,以路径长度为第一关键字,走到的关键点数量为第二关键字,由于最短路不会重复经过同一个点,所以这是正确的。

考虑到一个使用魔法的点是可行的,当且仅当原来就存在一条可行路径穿过它。所以,我们从所有可行终点倒着更新即可求出所有可行路径穿过的点。

复杂度 \(O(m\log m)\),瓶颈在最短路。

[USACO26 3rd G] Random Tree Generation

考虑枚举打乱标号前 1 号点的位置,再求出给其他点分配原本的标号的方案数,不难想到这其实有根树拓扑序个数计数。可见:树上拓扑序个数小记 - dengchengyu - 博客园。结论是

\[\frac {n!}{\prod_{i=1}^n sz_i} \]

所以换根求出所有的 \(\frac {1}{\prod _{i=1}^nsz_i}\) 的和,最后再乘上树的形态的概率 \(\frac 1 {(n-1)!}\)

P15410 「TBOI Round 1」Niton & Matrix - 洛谷

手玩第二个样例:

0 1 0    0 1 0
1 0 1 -> 0 1 0
0 1 0    0 1 0

0 1 0
0 1 1
0 1 0

可以发现第二排第三个可以单独改变。

研究它改变的方式后,可以推广出更一般的情况:

对于同一行满足与中间列对称的两个数,或同一列满足与中间行对称的两个数,可以单独将它们同时反转。特别地,奇数长度时中间行或中间列的数也可以单独反转

不难发现上述操作方式也是充分的,因为题目中所有操作都可以由上述操作得到。

考虑接下来怎么做,由于操作是可逆的,我们可以把初始矩阵和目标矩阵都用一种方式转化为相同的矩阵。而这是容易的,我们尽量把所有 \(1\) 都移到左上角即可。

P15412 「TBOI Round 1」Niton & Galgame - 洛谷

首先前两个条件要求 \(l\) 不能是非严格后缀最值,可以分别用单调栈维护最值的位置。

而后两个限制相当于要求 \(l\) 只能在一个前缀 \(l\le lim\) 内,有了上面建出的单调栈后,只需要找到第一个不等于 \(a_n\) 的位置即可。

我们对单调栈上的元素建倍增表,这样可以快速找到 \(lim\)。再找到两个单调栈第一个 \(\le lim\) 的位置 \(x,y\),求答案只需用 \(a_1\sim a_{lim}\) 的和减去单调栈上 \(x,y\) 之前的和即可。

可持久化操作也是容易的。

复杂度 \(O(m\log m)\)

字符串(abcd)

原题:qoj8207。

发现性质:对于一个字符串,若存在一个 ABCD 的循环位移,则可以把这个循环位移任意平移。

于是我们可以先把 \(S\) 化简成最简单的形式:我们把所有循环位移挪到最左侧,最终形如 ABCDABCD...ABCDXXX...,后面的 XXX... 内没有任何循环位移,我们发现里面的内容不影响答案。

于是我们只关心一共有多少循环位移,以及后面 XXX... 的长度。

上述「平移」还有一种等价形式,每次删掉字符串中的一个循环位移,将两边拼接起来,不断这样操作。

所以可以用栈线性求出循环位移数量 \(K\)

接下来考虑往后面的垃圾串里插入这 \(K\) 个循环位移。为了不重复,我们需要找到一种唯一分解:考虑每次删掉从后往前第一个循环位移。这样使得我们是从前往后插入,每次插入的位置不能在前一个插入位置之前。

但还是会有问题,我们插在中间时可能会和后面的字符形成循环位移,不满足它是最后一个循环位移的限制,于是插在中间时就只有 \(3\) 种方案,而之间接在末尾还是 \(4\) 种方案。

\(f_{i,j}\) 表示当前插了 \(i\) 个,末尾有 \(j\) 个可插入的间隔(不包括末尾)。设从 \(f_{i-1,j'}\) 转移过来,那么有 \(3\le j\le j'+3\)\(j=3\) 时则表示插到末尾。有转移:

\[f_{i,j}=(3+[j=3])\times \sum _{j'\ge j-3} f_{i-1,j'} \]

最终答案就是 \(\sum _jf_{K,j}\)

复杂度 \(O(Kn)\)

网格涂色(grid)

相当 Dilworth 定理,我们需要用最少的链覆盖,使得每一列覆盖的格子数 \(\ge a_i\)

我们让第 \(i\) 条链从 \((n-k+i,1)\) 走到 \((i,n)\)

考虑二分最少链数 \(k\),对于一条链肯定会走遍每一列,不妨先让每一列减去 \(k\)

有一个必要条件是 \(\sum \max(0,a_i-k)\le k(n-k)\)(每条链向上走 \((n-k)\) 次)。

下面构造证明它是充分的:从上到下加入每一条链,记录走到的坐标 \((x,y)\)

  • 若当前 \(a_i>0\)\((x-1,y)\) 还没有覆盖过,那么走到 \((x-1,y)\)
  • 否则走到 \((x,y+1)\)

高塔联络(tower)

题解 比较明白了。总结一下就是分析第一个数能走到的地方,然后可以不断向后推导出一条单调不降的链,使得其他位置都比两侧链上的位置小。由于此时链对链上两个数之间的部分贡献的 \(a\) 是相等的,于是可以递归进子问题。

实现时递归记录 \(l,r,del\),表示左端点,右端点,区间内 \(a\) 需要提前减去 \(del\)

河神(stream)

考虑杨表,杨表上相邻两个数不能同时选,不妨黑白染色,取黑白个数的最大值作为答案,可以证明这是最优的。

考虑到杨表的种类只与表中最大的 \(v=2^a3^b\) 有关,于是种类数是 \(O(\log ^2V)\) 的。考虑到每一个种类都出现在满足 \(\lfloor \frac ni\rfloor=v\) 的区间内,我们需要数区间内满足 \(\gcd(i,6)=1\) 的个数,区间的右端点则是 \(\lfloor \frac nv\rfloor\)

于是预处理所有可能的 \(v\) 以及它们每个表的答案,将所有 \(v\) 排序后即可单次 \(O(种类数)\) 询问。

可能需要 Barrett 约减优化除法。

传说(legend)

可以将前缀 \(\text{mex}\) 转化为后缀 \(\min\),另一边同理。设前缀 $\min $ 为 \(a_i\)

先考虑没有 \(-1\) 的情形,若 \(a_i\ne a_{i-1}\),则令 \(ans_i=a_i\)。再考虑其他位置怎么填,对于值 \(v\),找到 \(a_i>v\) 的最大 \(i\),记它为 \(f_v\),则要满足 \(v\) 的位置在 \([f_v+1,n]\) 内。另一个方向再取一个即可得到 \(v\) 的范围 \([l_v,r_v]\)

显然 \(l_v,r_v\) 是单调的,于是区间都是两两包含的,可以从小区间枚举到大区间算答案。

考虑有 \(-1\) 的情形,还是先得到 \(f_v\)。考虑找到第一个满足 \(a_i=v\)\(i\),记为 \(g_v\)(没有则置为无穷远处),则 \(v\) 的位置在 \([f_v+1,g_v]\) 范围内,对两个方向的区间取交可以得到 \([l_v,r_v]\)。经过证明此时所有区间依然是不交或包含的。

排序后即可建出树(递归)算出答案。

arc215_e CNOT Party

\(x\ne y\) 时操作是可逆的,考虑把 \(S,T\) 变成相同的形式。

  • 先把 \(S\) 变成使 \(1\) 尽量多。
  • \(S_i=1,T_i=0\),且存在 \(x=y=i\),则令 \(T_i\gets 1\)。这里表示最后操作所有 \(x=y\)
  • \(T\) 变成使 \(1\) 尽量多。

判断 \(S\) 是否等于 \(T\),然后输出方案,第二、三步的方案需要倒序输出。

arc215_f Scapus

我们先找到最小分数 \(s\)。从原树开始,每次同时删掉所有叶子,直到剩下的连通块是一条路径,此时的分数就是最小的 \(s\),记这条路径是 \(P\)

一条路径是好的当且仅当它包含 \(P\)

我们分成 \(P\) 是单点和 \(P\) 不是单点两种情况,可以用卷积做到 \(O(n\log n)\) 求答案。

P15411 「TBOI Round 1」Niton & Killaura - 洛谷

考虑答案的下界是 \(\sum _{i=1}^n \lfloor\frac {n-sz_i}3\rfloor\),不难发现是可以取到的。

考虑方案数,为了减少计算量,我们最后再乘上分配颜色的方案 \(n!\),我们现在要求分组方案。

\(g_x\) 表示 \(x\) 子树内的分组方案,我们每次把所有儿子子树的方案乘起来,再乘上给散点分配的方案。

\[g_x=f(1+\sum _{v}( sz_v\bmod 3))\times \prod _v g_v \]

其中 \(f(x)\) 表示 \(x\) 个散点分组的方案数,我们需要使得组数最少。

\[f(x)=\frac {x!}{(3!)^{\lfloor x/3\rfloor}\lfloor x/3\rfloor!(x\bmod 3)!} \]

我们预处理 \(f(1\sim n),g,g^{-1}\),换根即可做到线性复杂度。

#6485. LJJ 学二项式定理 - 题目 - LibreOJ

单位根反演学习笔记

前置知识,单位根反演:

对于 \(f(x)=\sum _{i=0}^n a_ix^i\)

\[\sum _{i=0}^n a_i[i\bmod m=k] =\frac 1m \sum _{j=0}^{m-1} w_{m}^{-jk}f(w_{m}^j) \]

不妨对于 \(k=0,1,2,3\) 求出 \(a_k\sum _{i=0}^n [i\bmod 4=k]\binom ni s^i\) ,全部加起来即可。

由于 \(\binom ni s^i\) 恰好是 \(f(x)=(1+sx)^n\)\(x^i\) 项系数。所以我们套用单位根反演的结论,上述式子就等于

\[\frac 14 \sum _{j=0}^3 w_{4}^{-jk}f(w_4^{j})=\frac 14 \sum _{j=0}^3 w_{4}^{-jk}(1+s\times w_4^{j})^n \]

100567. 2026.01.02【省选组】摩天大楼(skyscraper) (File IO)

题意:

求出所有长为 \(n\) 的满足 \(\sum _{i=1}^n a_i\equiv k\pmod {2^m}\)\(a_1\le v\) 的正整数序列 \(a_{1\dots n}\)\(\prod _{i=1}^n \dbinom {ca_i} {a_{i+1}}\) 的和。

对所有 \(0\le k<2^m\) 都要求答案。答案对 \(998244353\) 取模。

  • \(2\le n\le 8000,\ 1\le m\le 13,\ 1\le c\le 5,\ 1\le v\le 10^8\)

考虑使 \(a_i\) 可以等于 \(0\)。发现若序列中存在 \(0\) 则必有 \(a_n=0\) 时才有贡献,且此时 \(a_n\) 对乘积贡献为 \(1\),于是若存在 \(0\) 则前 \(n-1\) 位就能确定整个序列及其贡献。所以此时用 \(n\) 的答案减去 \(n-1\) 的答案就能得到原问题的答案。

考虑设生成函数:

\[F(x)=\sum_{a_1,\dots,a_n} \prod _{i=1}^{n-1}\binom {a_ic} {a_{i+1}}x^{a_1+\cdots +a_n} \]

我们只需求每个同余类的系数之和。

可以用分配率把 \(a_n\) 分离出来:

\[F(x)=\sum _{a_1,\dots,a_{n-1}}\prod _{i=1}^{n-2} \binom{a_ic}{a_{i+1}}x^{a_1+\cdots +a_{n-1}}\sum _{a_n\ge 0}\binom{a_{n-1}c} {a_n}x^{a_n} \]

二项式定理反过来用即可得到:

\[F(x)=\sum _{a_1,\dots,a_{n-1}}\prod _{i=1}^{n-2} \binom{a_ic}{a_{i+1}}x^{a_1+\cdots +a_{n-1}}(1+x)^{a_{n-1}c} \]

可以再把 \(a_{n-1}\) 分离出来:

\[F(x)=\sum _{a_1,\dots,a_{n-2}}\prod _{i=1}^{n-3} \binom{a_ic}{a_{i+1}}x^{a_1+\cdots +a_{n-2}}\sum_{a_{n-1}\ge 0} \binom{a_{n-2}c} {a_{n-1}} x^{a_{n-1}}(1+x)^{a_{n-1}c} \]

先合并:

\[F(x)=\sum _{a_1,\dots,a_{n-2}}\prod _{i=1}^{n-3} \binom{a_ic}{a_{i+1}}x^{a_1+\cdots +a_{n-2}}\sum_{a_{n-1}\ge 0} \binom{a_{n-2}c} {a_{n-1}} (x(1+x)^c)^{a_{n-1}} \]

同样用二项式定理:

\[F(x)=\sum _{a_1,\dots,a_{n-2}}\prod _{i=1}^{n-3} \binom{a_ic}{a_{i+1}}x^{a_1+\cdots +a_{n-2}}(1+x(1+x)^c)^{a_{n-2}c} \]

那么后面可以不断展开,我们设递推式:

\[f_0(x)=1 \]

\[f_{k+1}(x)=1+x(f_k(x))^c \]

\[F(x)=\sum _{a_1=0}^v (x(f_{n-1}(x))^c)^{a_1} \]

用等比数列求和得

\[F(x)=\frac {1-(x(f_{n-1}(x))^c)^{v+1}}{1-x(f_{n-1}(x))^c} \]

接下来终于可以求值了,套用单位根反演,对于 \(0\le k<2^m\),需要算

\[\frac {1}{2^m} \sum _{j=0}^{2^m-1}w_{2^m}^{-jk}F_n(w_{2^m}^j) \]

可以对所有单位根用递推式预处理 \(f_{n-1}(w_{2^m}^{*})\) 的值,这里是 \(O(2^mn\log c)\),计算所有 \(F(w_{2^m}^j)\) 则是 \(O(2^m\log (\text{mod}\times c\times v))\)

然后单位根反演的部分直接做就可以做到 \(O(2^{2m})\)

但是实际上这个式子求得的值就是把 \(F_n(w_{2^m}^j)\) 当成序列后,做一次 IDFT,第 \(k\) 项的值。于是可以做到 \(O(2^mm)\)

复杂度 \(O(2^mn\log c+2^m (m+\log (\text{mod} \times c\times v))\)

重塑记忆

先考虑计算最小值和最大值,这是容易的。然而 \(K\) 在范围内这并不是有解的充要,因为有奇偶性的问题。

能改变奇偶性的只有第一段和最后一段。

考虑枚举第一个和最后一个数,这样再求出最小值和最大值,充要就是 \(K\) 在范围内且与最小值的奇偶性相同。

接下来有两种做法:

  • 题解:从前往后贪心地填,动态维护当前的最小值和最大值,每次优先填 1
  • 我的赛时做法的更正:考虑先全部填上 0,求出此时的权值 \(c\)
    • \(c\le K\),我们从后往前找每一段问号,每一段问号也从后往前间隔地填 1,注意每次填 1 时要确保前一个位置为 0
    • \(c>K\),我们从后往前每次把两个相邻的固定的 1 中间的问号段全部变成 1,可以使 \(c\)\(2\)。要注意两个 1 直接相邻的情况不能使 \(c\)\(2\)

可见我的做法需要特判很多东西。

复杂度 \(O(n)\)

众里寻他

题目中选的点就是直径端点。每次删掉的点都是叶子,于是每次操作后得到的仍然是一棵树。

直径的中心要么是一个点,要么是一条边,是点还是边与直径的奇偶性相关。且每次改变时只会变成相邻的点或边。

我们把 \(n-1\) 条边拆成 \(2n-2\) 条有向边。

若当前直径中心是点,则直径中心改变的方式是:选取一个子树,保留至少一个直径端点,同时把其他子树的直径端点删空。

若当前直径中心是边,则直径中心改变的方式是:选取边的一端,这一端保留至少一个直径端点,同时把另一端的直径端点删空。

\(f_{i,j,k}\) 表示直径长 \(i\),直径中心的边为 \(j(x\to y)\),若当前直径中心是点,则表示 \(y\) 是当前直径中心,且 \((x,y)\) 是前一个直径中心;若当前直径中心是边,则表示 \((x,y)\) 是当前直径中心,且 \(x\) 是前一个直径中心。\(k\) 是上一个直径中心提前对当前直径中心删掉的点数。

对于当前直径中心是边的转移,设 \(g_{a,b}\) 表示一边删了 \(a\) 条边,另一边删了 \(b\) 条边,先从 \(f_{i,j,k}\to g_{k,0}\),然后转移 \(g_{i,j}\gets g_{i-1,j}+g_{i,j-1}\),最后转移到下一个直径中心:\(f_{i-1,j,k}\gets b!g_{k,b-1}\)(要指定另一边最后选),对于转移到 \(j\) 的反向边也是一样。

对于当前直径中心是点的转移,转移到反向边和上面是一样的。考虑转移到这一边的子树 \(s\),枚举子树大小 \(t\),那么最后总共删了 \(m=b+a-sz_s+t\) 个点,分成两类:

  • 最后删了另一边的点:\(f_{i-1,(y\to s),t} \gets b!(a-sz_s)!\binom {a-sz_s+t}{t} g_{a-sz_c+t,b-1}\)
  • 最后删了这一边非子树 \(s\) 内的点:\(f_{i-1,{y\to s},t} \gets b!(a-sz_s)!\binom {a-sz_s+t-1}{t}g_{a-sz_s+t-1,b}\)

初始状态是:任意选一条直径上的边,若中心是点则要指向这个点,否则这条边要是直径中心。

复杂度:\(f\) 对于一个直径中心,\(i,k\) 对数是 \(O(n)\)\(g\) 每次是 \(O(ab)\) 但是固定直径中心和直径长度后共是 \(O(n)\)。于是总复杂度是 \(O(n^2)\)

金字塔

考虑找到极大的正方形。极大的正方形边界上有至少三个点,考虑如果有一个点显然可以随便扩展,接下来考虑有两个点:

  • 若两个点在邻边,那么可以往一个方向扩展。
  • 若两个点在对边,那么这个正方形可以滑动,考虑滑动到有一个点在顶点上时,这时正方形可以扩展,另一个点同理,两个扩展后的正方形的并集可以覆盖原来的正方形,于是这种情况也不优。

考虑枚举矩形的下边界,二分高度,求出范围内左边最靠右的和右边最靠左的即可 check,可以顺序和逆序分别建持久化线段树,同时在两棵树上线段树二分即可。

由于极大正方形可能没有下边界,因此枚举上边界做同样的事情即可。

最后得到 \(O(n)\) 个极大正方形。

还要做矩形 chmax 和单点查。可以扫描线,由于一个边长更大的正方形来了之后,原来边长更小的正方形肯定不优,于是线段树上每个节点维护一个单调队列即可。

总复杂度 \(O(n\log n)\)

简单树上问题

题解做法是,给每种颜色随机一个到 \([1,5]\) 的映射,然后做 \(O(n3^5)\) 的 DP,大概要随 100+ 次。

但是有确定性做法:考虑点分治,那么此时根必选,变成四种颜色。考虑 DP,我们 DP 的方式是每次把数组传到儿子,儿子子树做完后再合并上来,这样每次只用加入一种新颜色,且每次转移是 \(O(1)\) 的。

我们对于选了 \(k\) 种颜色的方案,记录这些颜色是什么(假如 \(k=3\) 选了 \(x,y,z\) 三种颜色),为了能够转移还要分别记录不包含 \(x,y,z\) 这三种颜色之一的方案,于是 \(k\) 种颜色的方案只需要记录 \((k+1)\) 种,总共状态数是 \(2+3+4\),对于 \(k\) 更大时实际上是 \(O(k^2)\) 种。

复杂度 \(O(n k^2\log n)\)

时间旅行

考虑置换环,\(p_x\) 表示 \(x\) 号人最终要拿到 \(p_x\) 号物品。

考虑环中 \(s\) 最大的人 \(x\),且有 \(p_y=x\)。 我们把 \(s,t\) 预先离散化,则有 \(s_y<s_x,t_y>t_x\)

讨论它们 \(s,t\) 的六种相对关系后分为以下两种情况:

  • \(t_x<s_y\),此时执行操作 \(0\ x\ s_y,1\ x\ y,0\ y\ t_y\),这样 \(y\) 就拿到了 \(x\) 的物品,且环的规模减小了一,相当于多了一个 \(s_y\to t_x\) 的人。
  • 其他情况,我们认为还是产生一个 \(s_y\to t_x\) 的人,拿着 \(y\) 的物品。假设做完所有操作后,还剩下 \(x,y\) 两个人,\(y\)\(t_x\) 处,此时执行 \(0\ x\ t_x,1\ x\ y,0\ y\ t_y\) 即可。

维护两个序列,一个表示前面做的操作,一个表示后面做的操作。复杂度 \(O(n\log n)\),瓶颈在排序。操作数为 \(\le3n\)

挑战子集和

考虑 \(k=0\)\(a>0\) 的情况,对 \(a\) 排序,每次取出 \(a_2\),贪心进行 \((x,x+a_2)\) 匹配,保留前者,即可变成规模为 \(n-1\) 的问题。

考虑 \(a\) 没有限制的情况,考虑给所有数减去 \(-\min a_i\),用上面的方法求出答案,在选出一个集合使得和等于 \(-\min a_i\),把它们翻转即可。因为对于负数 \(x\),原来的集合里选 \(x\) 和新的集合里不选 \(-x\) 是双射。

考虑 \(k=1\) 的情况,考虑 \(\min +\max\) 等于所有数的和,于是当原集合的 \(\min,\max\) 与现在的相同,那么利用 \(\sum ans_i=2^{n-1}(\min +\max)\) 可以求出缺失的元素。

否则不妨假设缺失 \(\max\)\(sum+\max=2^{n-1}\min +2^{n-1}\max\) 可以解出 \(\max\),再利用上面即可。

对于 \(n=1\) 特判即可。

直至云雨消散

每个点的点权都是 \(\max _{j=i}^{R_i} b_j\),显然 \(R\) 内的相对位置是不变的。可以平衡树维护 \(R\) 序列。

考虑每个点向后面第一个比它大的位置连边,构成一棵树。

先考虑全局操作,那么一些点值会被覆盖掉,每次删掉的点一定是叶子。考虑查询怎么办,往上跳找到第一个没有被删掉的点,统计它到最后一个 \(\le R_r\) 的链和。

一般地,此时删掉的不一定是叶子,但是发现删掉的不是叶子的点只可能是左端点的点值,我们把这个值在树上点权赋成 \(0\),查询依旧找到第一个没有被删掉的叶子,然后跳倍增,前者实际上就是 \(\max _{j=l}^{R_l}\)。用树状数组维护根链和。

复杂度 \(O(n\log n)\)

喧嚣

发现相当于 (( 结构可以随意移动,同时它们还能翻转。那么求出区间内 (( 的数量 \(s\),这里的数量指的是找到一个将其删去并将两边拼接,不断这样操作。暴力的方法是维护一个栈。

然后剩下的结构要么是 ()...(),要么是 )()...()(,前者答案是 \(2s+1\),后者或剩下啥都不剩时答案是 \(2s\)

改成线段树维护即可,复杂度 \(O(n\log n)\)

二叉树操作

\(f_x\) 表示当前节点权值为 \(b=x\) 时的最少操作次数,转移是对两个儿子做 \(\min,+\) 卷积再加绝对值函数。

由于绝对值函数是凸的,于是 DP 函数是凸的。

注意两个凸函数做卷积实际上就是求闵可夫斯基和。而由于斜率是树高级别的,所以凸包只有 \(O(n)\) 段,复杂度 \(O(2^nn)\)

可以使用 Slope Trick 的技巧只记录断点,每个断点处表示斜率增加一,每次合并时起点斜率等于两起点斜率的最小值。

距离

对于一个合法的 \(f\) 可以构造一个对应的 \(S\),将所有不在任意一个关键点的 \(f_i-1\) 邻域内的点全部全部加入进 \(S\)

定义 \(g_i=\max(0,\max _{1\le j\le k} f_j-\text{dis}(i,a_j))\)\(g_i=0\) 就表示加入进 \(S\)。对于 \(1\le i\le k\) 要有 \(g_{a_i}=f_i\) 否则会存在 \(f_j-\text dis(a_i,a_j)>f_i\)\(f\) 的定义矛盾。于是合法的 \(g\) 只有一个 \(f\),又由于 \(g\) 是由 \(f\) 定义的,所以这是双射,我们计算 \(g\) 的方案数。

合法的 \(g\) 满足:

  • 对于边 \((u,v)\)\(|g_u-g_v|\le 1\)
  • 对于非关键点 \(u\),要么 \(g_u=0\),要么周围有一个点使得 \(g_v=g_u+1\)
  • 任意关键点有一条严格递减的路径到达 \(0\)

\(f_{v,0/1,0/1/2}\),表示当前点 \(g=v\),有没有周围点满足 \(g=v+1\)。子树内有或没有递减链,子树内有且需要一条递增链到达 \(0\)

复杂度 \(O(n^2)\)

黑猩猩找

考虑每一维到达整数的时刻就是进入一个新的立方体。

还要减掉同时到达的时刻。

于是就是求

\[\sum _S (-1)^{|S|+1} \gcd S \]

反演可以得到最终的式子:

\[\sum_d \varphi(d) \]

其中 \(d\) 是所有 \(l_i\) 因数的并集。

国预的战争

首先容斥成 \(> k\)

对于链的做法,每个点前面 \(k-1\) 个点都是不同颜色,而这个点也要与它们不同颜色,答案就是 \(\prod (m-\min(i-1,k-1))\)

可以扩展到正解,我们尝试一种涂色方法,使得 \(k\) 邻域内所有涂过色的点不同色。

BFS 序满足这个限制,因为考虑 \(k\) 邻域内两个点 \(x,y\) 它们的距离肯定不如把其中一个点换成当前点的距离,于是它们两两距离 \(\le k\)

直接数点做到 \(O(n^2)\),用点分治做偏序可以做到 \(O(n\log ^2n)\)

可以用长剖做到 \(O(n)\)。具体来说把两个点之间的贡献放在 LCA 处考虑,分为这个点处轻边对轻边、轻边对重边、重边对轻边的贡献,然后把贡献标记挂在节点上,最后扫一遍整棵树即可。

不是不是诈骗题

找到一些最大点对,然后询问时扫这些点对,没找到符合条件的就建虚树直接求。

具体来说先随 \(O(n)\) 个点对,然后取 \(O(1)\) 大的,这个点对期望是第 \(O(n)\) 大。

dfs 一遍维护可并堆,在 LCA 处统计,每次在两个堆中遍历,找到所有 \(O(n)\) 个最大点对。

然后处理这 \(O(n)\) 个点对,我们维护一个合法点对集合,每次从大往小尝试加入,扫描当前所有合法点对,若包含任意一个则 break,这样期望找到 \(O(\sqrt n)\) 个合法点对,可以证明期望复杂度是 \(O(n\log n)\)

询问也是同理,直接扫着 \(O(\sqrt n)\) 个合法点对,期望复杂度也是 \(O(n\log n)\)

若没有找到,则有期望 \(O(\sqrt n)\) 个,每个期望长度 \(O(\sqrt n)\),总和 \(O(n)\),建虚树复杂度总和是 \(O(n\log n)\)

总复杂度 \(O(n\log n)\)

ladder

做法一:记录当前梯子高度和这一节的高度,复杂度 \(O(nm^2)\)

做法二:考虑一个不上升序列的构造,每次要么 push_back 一个 \(1\),要么全局加 \(1\)。可以在 push_back \(1\) 的时候选择是否对齐下端。假设之前一共选择 \(k\) 个,那么每次全局加 \(1\) 时就会使得总高度增加 \(k\)。记录总高度和 \(k\) DP,复杂度 \(O(n^2m)\)

考虑平衡,对于一节梯子 \(\ge \sqrt m\) 的使用做法二,否则用做法一算,具体来说令做法二中每次 push_back 的是 \(\sqrt m\) 即可。

复杂度 \(O(nm\sqrt m)\)

math

外面的期望都是可以拆掉放在里面的,拆成两点减去 LCA 的期望深度。

期望深度容易 \(O(n\log n)\) 算。

我们需要求 \(f_d=\sum _{d|i}\sum _{d|j} P( d\text { is lca}(i,j))\)

\(P_i(j)\) 表示 \(i\)\(j\) 祖先的概率,先初始化每个倍数的概率,再对每个倍数枚举倍数转移,复杂度 \(O(n\log ^2n)\)

那么 \(f_d=\sum _{d|i}\sum _{d|j}P_d(i)P_d(j)-\sum _{d|g \land g\ne d}f_gP^2_d(g)\)

总复杂两只 log。

occur

考虑莫队,那么每次相当于询问 \(l\in [L,R],r=R\)\(S[l,r]\)\(occ\) 之和。

考虑 SAM,那么相当于在 Parent 树上找到根链上从上往下第一个满足 \(len\ge R-L+1\) 的点,这个点以上全部由贡献,这个点有一半贡献。倍增可以做到 \(O(n\sqrt n\log n)\)

考虑二次离线,对 \(len\) 从大到小扫描,用并查集维护父亲即可。

复杂度 \(O(n\sqrt n\alpha(n))\)

posted @ 2026-02-25 21:15  dengchengyu  阅读(42)  评论(0)    收藏  举报