dmy 长训笔记

随机说话,这些东西真能写吗。

\(\text{day 1 / 2026.9.3}\)

为啥是半停课来着。早上先上了两节文化课才进场,发现竟然可以任选 4h 打模拟赛,还是太超前了。

前面忘了,中间忘了,这怎么不是题啊,最后半小时发现 B 是送的,暴力忘打了,哈希被卡了。

T1

一个长 \(n\) 的序列,划分为了恰好 \(k\) 段,给出划分位置 \(a_i\),定义一种序列的权值为每段 \(\min\) 的乘积,求所有可能序列的权值和。

\(1 \le n \le 100\)

其实部分分好像确实有很大提示了。

我们先弱化一下题目,如果要求每段的 \(\min\) 递减怎么做,考虑设 \(f_{i,j}\) 表示前 \(i\) 个段,值域上之前有 \(j\) 个数没填,扫一遍乘组合数直接填就行了。

发现我们没有任何办法处理 \(\min\) 不单调的情况,考虑暴力枚举,我们只需要知道每种长度的段有多少就行了,于是暴力记一下这个东西,状态数其实是 \(\le 2\times 10^5\),可能有点卡常,混合进制压一下就行了,复杂度 \(O(n^2S)\)

拿 ds 改了下暴力代码。

\(\text{Submission}\)

T2

给定带权无向图,定义一条路径的字典序为 \(1\) 到终点上边编号组成的序列,求每个点字典序第二大最短路。

\(1 \le n \le 2\times 10^5,1\le m \le 5\times 10^5\)

跑出来最短路 DAG,然后发现只需要维护比较两个字典序大小,倍增就行了,最后半小时脑子抽了觉得这个不对,写了个主席树被卡哈希了。

其实连倍增都不用,考虑因为是边字典序,直接跑一遍 dfs 找出第二条路径即可,复杂度 \(O((n+m)\log m)\),瓶颈在 dij。

\(\text{Submission}\)

T3

给定 \(n\) 个坐标为 \(x_i\),颜色为 \(c_i\) 的点,要求选出 \(m\) 个颜色互不相同点使得 \(\sum \limits_{i<j} (x_i - x_j)^2\) 最小。

\(1 \le n \le 5\times 10^5\)

(考虑较优解并尝试是否是最优或者调整)

困难啊。

考虑拆一下式子 \(\sum (x_i - x_j)^2 = m(\sum x_i^2) - (\sum x_i)^2\),考虑这个东西是方差的 \(m\) 倍,于是我们只需要最小化方差。

问题变成,我们选择一个实数 \(t\),使得 \(\sum (x_i - t)^2\) 最小,暴力的话就是把所有 \(\frac{x_i + x_j}{2}\)\(O(n^2)\) 个变化点拿出来,每次取前 \(m\) 近的,复杂度 \(O(n^3)\)

考虑每个点被统计入 \(m\) 个点的 \(t\) 范围一定是一个区间,我们只需要对于每个点 \(i\) 求出其存在的时间 \([l_i,r_i]\) 然后就可以扫描线一遍统计出答案了。

并且,我们只需要考虑 \(l_i\) 的做法,因为 \(r_i\) 是等价的。显然首先有一个限制,记 \(p\) 为与 \(i\) 同色的上一个点,那么需要有 \(l \ge \frac{x_p + x_i}{2}\)。然后我们再把 \(i\) 前第 \(m\) 近的点求出来,记为 \(p_m\),那么我们的坐标还需要满足 \(l \ge \frac{a_{p_m} + a_i}{2}\),注意我们这里钦定了所有点坐标互不相同,虽然这里可能会存在一点 corner。

维护前 \(m\) 近的点,拿一个 set 维护坐标颜色二元组每次插入删除即可,复杂度 \(O(n\log n)\)

其实代码是 \(85\) 分的,我真调不出来哪错了。

\(\text{Submission}\)

T4

给定序列 \(a_i\) 和常数 \(X,k\),AB 两人博弈 \(k\) 轮,每次可以选择一个区间 \([l,r]\),令 \(i \in [l,r],a_i \gets X-a_i\),A 想要和最大,B 想要和最小,求最终结果。

\(1 \le n \le 2\times 10^5,1 \le V \le 10^9\)

(问题难以操作考虑分治)

首先,我们可以令 \(a'_i \gets a_i - \frac{X}{2}\),然后每次操作就变成取反了。

对于 \(k=1\) 的情况,显然答案为原序列加最大子段和。

对于 \(k>2\) 的情况,我们可以证明,其结果等于 \((k+1) \bmod 2 + 1\) 的情况,具体地,记 \((k+1) \bmod 2 + 1\) 的结果为 \(M\)\(k\) 的答案为 \(M'\),由于每一轮 \(A\) 可以用自己的操作取消 \(B\) 的操作,于是 \(M' \ge M\),每一轮 \(B\) 也可以用自己的操作取消 \(A\) 的操作,所以 \(M' \le M\),于是有 \(M = M'\)

然后我们只需要考虑 \(k=2\) 的情况,我们要求的是在一段区间 \([l,r]\) 取反后的最大子段和,这个东西显然很困难,考虑分治。

考虑第一段区间 \([l,r]\) 跨过当前分治中心 \(\text{mid}\),于是,我们将原序列变为 \(a_1,a_2,\dots,a_{l-1},-a_l,-a_{l+1},\dots,-a_{mid},\dots,-a_r,a_{r+1},\dots,a_n\) 的形式,我们对中点两边分开维护最大子段和,最终答案即为第二个区间全选左,全选右,跨过 \(mid\) 中的最大值,每部分都可以被拆成左加右取 \(\max\) 的形式,我们要求这个 \(\max\) 的最小值,钦定最大值然后跑二维偏序即可,复杂度加上分治,为 \(O(n\log^2 n)\)

先写个暴力再加上二维偏序感觉手感很顺啊。

\(\text{Submission}\)

\(\text{day 2 / 2026.9.4}\)

前面忘了,中间忘了,连着中午打比赛导致晚自习睡着了。

CF2238E Cake Trial

给定一个字符串包含 0,1,?,两人博弈,A 把 ? 变成 01,B 选择一个区间内 \(1\) 加区间外 \(0\) 和最小的区间,求 A 最大可以让 B 的代价为多少。

\(1 \le n \le 500\)

先差一下,区间内 \(1\) 和区间外 \(0\) 等价于所有 \(0\) 减去区间内 \(1\)\(0\) 的个数差,于是,我们考虑 \(1 \to 1\)\(0 \to -1\),于是只需要维护最大子段和,把子段和记到状态里暴力跑就行了,具体的,记 \(f_{i,nw,mx}\) 表示前 \(i\) 个位置,后缀最大值为 \(nw\),最大子段和为 \(mx\),转移即可,复杂度 \(O(n^3)\)

\(\text{Submission}\)

CF2252E Generational Triplets

给定 \(n\),求出三元组 \((a,b,c)\) 的个数满足,\(a + k = b,b + k = c, k > 0\)\(a \oplus b \oplus c = 0\)

\(1 \le n \le 10^{18}\)

晚自习推了半天假了。

考虑怎么把加法和异或联系起来,即 \(a+c = (a \oplus c) + 2(a \wedge c)\),并且有 \(a+c = 2b,a \oplus c = b\),得到 \(a \oplus c = 2(a\wedge c)\),把每一位写开,得到 \(a_i \oplus c_i = a_{i-1} \wedge c_{i-1}\)

并且最高位上必须是 \(a_k=0,b_k=1,c_k=1\),于是我们可以倒推,发现后面必须是 \(a_i = 0,c_i = 1,a_{i-1}=1,c_{i-1}=1\)\(c_i = 0\) 的时候要求前面不能是 \(a_i = 1\),于是我们能发现唯一的限制是要求最高位所在 \(1\) 连续段长度为偶数,对这个数位 dp 就行了。

\(\text{Submission}\)

CF2236F2 Elections in Saransk (hard version)

给定序列 \(a\) 和常数 \(x\),对每个数选出一个因数 \(p_i\),求 \(x \times \operatorname{lcm}(p_1,p_2,\dots,p_n) = \prod p_i\) 的方案数。

\(1 \le n \le 10^5,1 \le V \le 5\times 10^5\)

枚举质因数,显然每个质因数是独立的,限制等价于要求 \(\sum - \max = k\)\(k\)\(x\) 在质数 \(p\) 的指数,考虑钦定 \(\max\) 及其出现位置,前后缀拼一下背包即可,去重的话钦定后缀背包取不到最大值即可,复杂度 \(O(n\log^3 V)\)

\(\text{Submission}\)

CF2237F Paint the Array

给定序列 \(a\),一次染色可以把长 \(m\) 的区间染色为 \(1,2,\dots,m\),求修改序列 \(a\) 最少的位置使得其可以被染色得到的数量。

\(1 \le n \le 5\times 10^5\)

考虑暴力,设 \(f_{i,j}\) 表示第 \(i\) 个位置,颜色为 \(j\) 的最大保留,写出转移:

\[f_{i,j} = \max (f_{i-1,j-1},f_{i-1,m}) + [j \neq a_i] \]

\[f_{i,1} = \max f_{i-1,j} + [a_i \neq 1] \]

拿个线段树做整体转移即可,每次支持区间平移,单点修改,区间取 \(\min\),复杂度 \(O(n\log n)\)

\(\text{Submission}\)

CF2253F 4-beauty

定义一个集合的权值为选择一个等差数列四元组,其中两个数 \(x,y\) 满足 \(x|y\) 的对数的最大值,现在给定 \(1,2,\dots,n\) 的自然数集,以及删掉每个位置的代价 \(a_i\),求最小删除代价,使得集合的权值减小。

\(1 \le n \le 5\times 10^5\)

首先注意到权值最大为 \(4\),只在 \((a,2a,3a,4a)\) 时满足,于是问题变成不能同时存在 \((a,2a,3a,4a)\),相当于选择 \(a\),可以覆盖 \(a,2a,3a,4a\),求覆盖所有点的最小代价,这个就是 P3226 的加强版。

考虑只需要一个 L 型的东西,倒着枚举下一行的状态,本行出现三个 \(1\) 时下一行这一行就强制不能为 \(1\),其他位置任意,于是只需要查询一个子集 \(\max\),做高位前缀和即可,复杂度可以分析到 \(O(n\log^2 n)\)

\(\text{Submission}\)

AT_arc227_e [ARC227E] Shift and XOR Switches

有长 \(n\) 的序列 \(B_i\) 和序列 \(A_i\)\(B\) 初始只有 \(B_1=1\),其余均为 \(0\),你可以以任意顺序选择 \(A\) 的一个子集,对于选择的每个 \(A_i\)\(B_{j} \gets B_{j} \oplus [j>A_i]B_{j-A_i}\),求最终可能得到的不同 B 的种数。

\(1 \le n,m \le 2\times 10^5\)

还有 callcallback 环节。

考虑每次操作等价于在 \(\bmod 2\) 意义下乘一个 \((1 + x^{A_i})\),所以选择的顺序和最终序列是无关的。

我们声明,在选择的 \(A\) 序列不存在重复元素时,两种选择得到的 \(B\) 序列一定不同,考虑证明。

拿两个多项式相除,\(F = \frac{\prod \limits_{k \in S} (1 + x^k)}{\prod \limits_{k \in T}(1+x^k)}\),如果相同则 \(F = 1\),考虑当前两个集合为 \(S,T\),我们取 \(S' = S \setminus T\)\(T' = T \setminus S\)\(k_0\)\(S' \cup T'\) 中最小的一个元素。

由于 \(\frac{1}{(1+x^k)} = 1 + x^k + x^{2k} + \dots\),所以更大的项不会影响到 \(x^{k_0}\) 的系数,所以在 \(F\)\(x^{k_0}\) 的系数一定为 \(1\),所以 \(F\) 一定不等于常数 \(1\),即两个 \(B\) 一定不同。

接着考虑存在相同元素的情况,注意到 \((1+x^k)^2 \equiv (1 + x^{2k}) \pmod 2\),所以我们可以把 \(A_i\) 表示为 \(a\times 2^k\),其中 \(a\) 为一个奇数,那么,所有 \(a\) 之间的方案数是独立的,我们只需要考虑所有 \(2^k\) 可能构成的状态数即可,复杂度精细实现即可做到 \(O(n+m)\)

还是具体写一下怎么 dp,显然最终不会同时选择两个一样的数,于是我们只需要给每个 \(k\) 保留至多三个,dp 的时候设 \(f_{i,j}\) 表示 \(i\) 此时保留了 \(j\),转移的时候判断本位是否留 \(1\) 即可,因为每个数只会被 \(a\times 2^k\) 唯一访问一次,所以复杂度 \(O(n+m)\)

\(\text{Submission}\)

CF2245F Familiar?

给了一段代码,大概是一个序列 \(p\)\(b\) 数组为 \(b_i\) 在前缀单调栈中弹出的元素个数,现在给序列 \(a\),要求对于 \(a_i \neq -1\) 的位置有 \(a_i = b_i\),求序列种数。

\(1 \le n \le 500\)

注意到这个条件等价于笛卡尔树上左儿子的右链长度,考虑对着笛卡尔树 dp。

\(f_{l,r,k}\) 表示区间 \([l,r]\) 构成的笛卡尔树,根结点右链长 \(k\) 的方案数,有转移:

\[ f_{l,r,k} = \sum \limits_{i=l}^r \binom{r-l}{i-l} \left\{\begin{matrix} (\sum f_{l,i-1,j})f_{i+1,r,k-1} & a_i = -1 \\ f_{l,i-1,a_i}f_{i+1,r,k-1}& a_i \neq -1 \end{matrix}\right. \]

摁着前缀和转移可以做到 \(O(n^4)\)

考虑精细分析复杂度,对于后面 \((r,k)\) 两维,在 \(a_i = -1\) 时,我们可以定义前缀和数组 \(g_{l,r} = \sum f_{l,r,i}\),把式子中的替换掉,做到 \(O(1)\) 转移,在 \(a_i \neq -1\) 时,考虑一定有 \(\sum a_i \le n\),不然序列就不合法了,所以 \((r,k)\) 两维的数量级是 \(O(n)\),精细实现一下即可,复杂度 \(O(n^3)\)

写的时候拿 vector 开一下空间精细实现判一下边界就好了。

\(\text{Submission}\)

CF2247F Paths on a Grid

给定带障碍的 \(n\times m\) 的网络,一个格子集合是好的,当且仅当经过其中任意一个点的路径也都经过集合内的其他点,求这样的集合数量。

\(1 \le n\times m \le 10^6\)

好像是有正经做法的,考虑想同一 scc 内的点连边,每次求个 DAG 上 LCA 即可,复杂度 \(O(nm\log nm)\)

但是我们有更好的做法,考虑集合哈希,给每个点赋一个随机权,用路径数乘一下加起来,jiangly 上课讲了这东西的错误率,有点忘了,但是能过,尽可能选随机大质数作模数就好了。

哈希的时候每次用路径数乘当前点权,扔进二元组统计相同个数即可,复杂度 \(O(nm)\),这里实现多了个 \(\log\)

\(\text{Submission}\)

CF2248G No Balance Left

给定 \(n\) 个价格分别为 \(c_i\) 的商品,\(m\) 个活动,满 \(a_i\) 返还 \(b_i\)。每次支付可以选择购买任意多任意商品,使得价格和不超过当前余额,然后选择返额最大的活动返额,对 \(h \in [1,s]\),判断初始零钱 \(h\) 能否通过购买归零。

\(1 \le n \le 1.25\times 10^5,a_i < a_{i+1},b_i < b_{i+1}\)

好题啊。

先不考虑返额,我们可以把每个物品 \(\le s\) 的若干倍都扔进桶里,最后把桶里每个元素都重新当作元素跑一遍背包,就可以得到所有为购买可达金额,复杂度 \(O(\frac{n^2}{w})\)

我们可以预处理得到 \(d_i\) 表示购买 \(i\) 元时的返利。先假设所有位置 \(i \ge d_i\),然后对于每一个返利金额,找到每一个可达的变化量,之后我们只需要从小到大对每一个金额判断其是否能在有返利的情况下到达,如果可达的话再把所有返利变化量加上当前这个初始金额与有返利可达集合合并,这部分也可以 bitset 完成,复杂度 \(O(\frac{n^2}{w})\)

然后考虑 \(i < d_i\),我们首先找到最小的 \(i < d_i\),这就是最小的初始余额可以使得我们后面的钱数变成无限大,记为 \(\text{lim}\)。在钱数 \(\ge \text{lim}\),我们可以让钱无线增加,再看我们拥有的所有操作带来的变化量能否让钱归零即可,列举一下我们拥有的操作:

  • \(i \le s\) 时,有 \(i - d_i\),这里 \(i\) 需要能被凑出来,这个我们之前预处理了。
  • \(i > s\) 时,有 \(i - d_s\),前提是这个 \(i\) 能被所有 \(c_i\) 凑出来,换句话说,这里 \(i =\sum k_jc_j\),所有 \(k_j \ge 0\)

第一个条件是简单的,第二个我们可以拆一下条件,不妨假设 \(i = kc_j > s\),那么我们要的是 \(\gcd(kc_j - d_s,(k+1)c_j - d_s,(k+2)c_j - d_s,\dots)\),因为这里 \(d_s\) 是是常数,辗转相减一下就能得到这个式子等价于 \(\gcd(c_j,d_s)\)

于是我们只需要所有差的 \(\gcd\),所有商和 \(d_s\)\(\gcd\) 每次判断是否整除即可,复杂度 \(O(\frac{n^2}{w})\)

\(\text{Submission}\)

AT_arc227_f [ARC227F] Erase and Raise

给定长 \(n\) 的初始全 \(0\) 序列,一次操作可以选择两个数值相同的位置,将他们删除,并将区间所有数 \(+1\),求最终不能操作后有多少不同的序列,对 \(998244353\) 取模。

\(1 \le n \le 2\times 10^5\)

肯定要对着最终状态计数,考虑最终状态有什么性质:

  1. 序列长度 \(m\)\(n\) 同奇偶。
  2. 所有数互不相同。
  3. 因为每次操作是区间 \(+1\),所以差分数组的绝对值每次最多在左右两端增加 \(2\),而区间长度又减少了 \(2\),记序列 \(b\) 的差分数组为 \(c\),这启示我们有 \(\sum |c_i - c_{i-1}| + m \le n\)

这三个条件其实是充要的了,考虑我们可以从一个最终序列反推回去,每次选择一个极长的正整数段,区间 \(-1\),再在左右插入一个 \(0\),这样 \(\sum |c_i - c_{i-1}|+m \le n\) 没有变化,而且也满足第一个条件,最后肯定能得到一个长 \(m\) 的全 \(0\) 的序列,满足第一个条件且 \(m \le n\),考虑原序列可以每次操作两个相邻的 \(0\) 使 \(n\) 变小,所以最终序列是一定可以得到的。

然后我们就只需要对着这三个条件计数即可,考虑连续段 dp,设 \(f_{i,j,k}\) 表示当前插入了 \(i\) 个数,\(j\) 个段,\(\sum |c_i - c_{i-1}| + m = k\)

摁着转移可以做到 \(O(n^3)\),注意到转移过程中 \(i\) 没有提供任何有关系数或者参数上的转移,只是每轮会让 \(k\) 增加若干倍 \(j\),而且 \(k\) 也是随 \(i\) 递增的,考虑把 \(i\) 这一维扔掉,枚举 \(k\) 来表示轮次的变化,每次再用 \(j\) 增加 \(k\) 表示转移,这样复杂度就降到了 \(O(n^2)\)

进一步地,由于式子是 \(\sum |c_i - c_{i-1}| + m = k\),山峰状的贡献就限制了最大值不能超过 \(\sqrt n\),对应到转移中就是我们的段数不能超过 \(\sqrt n\),所以现在复杂度就变成 \(O(n\sqrt n)\)

\(\text{Submission}\)

\(\text{day 3 / 2026.9.5}\)

哦原来周六是让大家抓紧写完下班的吗。我说 T1 > T2 > T3 > T4 有没有懂的。

T1

给定两个数组 \(a,b\),你每次可以支持把 \(a\) 中一个非最大值 \(+1\) 或者把一个非最小值 \(-1\),求最少多少次操作可以得到 \(b\)

\(1 \le n \le 4\times 10^5\)

一百万个 corner case。

先判掉上下界变大的,然后我们能够发现大部分都是有解并且答案为 \(\sum |a_i - b_i|\),考虑唯一的不合法情况就是只有一个从最大值变到任意值,一个从最小值变到任意值,然后这两个任意值有交,我们就需要找一个垫子把这两个任意值先垫出来,直接做就行了,复杂度 \(O(n)\)

赛时脑瘫了,多写了一个判断挂到 \(30\)

\(\text{Submission}\)

T2

给定序列 \(a\),找到最长的区间使得,删掉一种 \(v\),整个区间都是严格递增的,并且原始区间左右两端不是 \(v\)

\(1 \le n \le 2\times 10^6\)

考虑枚举值 \(v\),每次只需要 check 左右的极长段能否合并,但是这个题给的限制太诡异了,有很多 corner,赛时少写了一个 corner,挂到 55,开了 ll 空间还爆了,挂到 0。

何意味。

\(\text{Submission}\)

T3

给出一棵树,每个有集合,定义路径的权值为路径上点的并,对于每个点为根的情况,每次可以修改叶子集合为任意集合,对每个点求使得所有叶子到根路径均相同的最小修改数。

\(1 \le n \le 2\times 10^5,1 \le m \le 6\)

唐了,场上觉得这个东西很困难。

考虑所有非叶子的并一定是答案状态的子集,于是我们只考虑叶子组成的集合,对每个点统计子树内不同状态的集合数量,每次向上合并,找到数量最多的一个集合保留其他的修改即可,不定根换根 dp 即可,复杂度 \(O(n2^m)\),也有不少 corner。

\(\text{Submission}\)

T4

给定 \(n,k\),构造若干长度和为 \(n\) 的置换环,使得环长的 \(\operatorname{lcm}\)\(k\) 的因数。

\(1 \le n \le 10^18,1 \le k \le 10^15\)

为啥 *3300 来着。

考虑只需要看 \(k\) 的所有质因子跑背包能不能跑出 \(n\),然后判一些平凡的情况,记因子个数为 \(m\)

  1. \(m=1\) 时,判断是否整除即可。
  2. \(m=2\) 时,解一个二元一次方程。
  3. \(m>2\) 时,直接同余最短路,因为此时最小的质数 \(\le 10^5\)

而且因为只有 \(50\) 个本质不同的 \(k\),相同 \(k\) 放一块做就行了。

\(\text{Submission}\)

\(\text{day 4 / 2026.9.7}\)

CF2248F Matrix Elimination

给出一个矩形,每个点有权值,称一个点峰值当且仅当他不小于除了他自己以外所在行和列的所有点值和,现在一次操作可以选择任意一个矩形减一,求使得至少有 \(k\) 个峰值的最小操作次数。

\(1 \le nm \le 10^5\)

做了一晚上不会,大笑。

考虑 \(n,m \ge 2\) 的情况,能发现,对全局操作一定是最优的,因为其贡献最大,找到和第 \(k\) 大,除一下就行了。

然后考虑序列问题,继续发现,其实只有三种操作:

  • \([1,n]\) 所有数 \(-1\)
  • \([1,n-1]\) 所有数 \(-1\)
  • \([2,n]\) 所有数 \(-1\)

其实大部分情况都是第一种操作最优,唯一的 corner 就是类似 1 1 1 1 0 的情况,也就是有且只有一个峰值的时候,而且此时二三操作只会进行其中一种。

所以,我们只需要设第一种和第二/三种操作的次数,解一下方程组判断是否有解就行了。

\(\text{Submission}\)

QOJ18472. 交换余生

给定序列 \(a\),求能否重排为新序列 \(b\),使得不存在 \(\gcd(b_1,b_2,\dots,b_i) = \gcd(b_{i+1},b_{i+2},\dots,b_n)\)

\(1 \le n \le 2\times 10^5\)

显然这两个 \(\gcd\) 等于全局的 \(\gcd\),把所有数除以全局的 \(\gcd\),显然 \(\gcd=1\) 的最多只有中间一个位置,其余前后缀 \(\gcd\) 均不等于 \(1\),等价于集合划分,我们枚举前两个数的所有质因子 check 删除一个位置后是否可以划分即可,复杂度 \(O(n\log n)\)

\(\text{Submission}\)

QOJ17962. 考试

给定一个矩形,求有多少从左上角走到右下角的路径形成的序列的最大子段和恰好 \(k\)

\(1 \le n \le 20\)

meet-in-the-middle,然后做完了。考虑折半搜索,记录路径最大后缀和,大于 \(k\) 直接剪枝,可以每次搜出 \(\le k\) 的路径数,差分一下就行了。

\(\text{Submission}\)

CF2252F Spectral Components

给出一棵树,点有颜色,对每个颜色有一个 \(k_i\),求选出树上大小为 \(k_i\) 的联通块,使得所有颜色为 \(i\) 的点到联通块距离和最小。

\(1 \le n \le 2\times 10^5\)

考虑 \(k=1\) 怎么做,显然此时是虚树的带权重心,考虑推广。

我们以虚树的重心为根,那么每一条边的权值就是两端子树权的最小值,可以被选 \(|dep_u - dep_v|\) 次,把这个二元组扔进堆跑一遍就好了,为什么一定是个联通块呢,因为我们是以虚树为根,可以认为每次选择深度最小的边,其实选择什么都是一样的吧。

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

\(\text{Submission}\)

QOJ18302. 混音

给定 \(n\) 个数构成的可重集,一次操作定义为,从中拿出一个子集,再把这个子集的 \(\max\) - \(\min\) 扔进去,求最终剩下的值的最大值。

\(1 \le n \le 10^5\)

好题。

考虑最终最大值一定会留下,我们只需要最小化其他值的最终值。

考虑一个值是怎么形成的,他一定可以被写作两个不交的集合的元素和之差,那么,这个下界就是 \(\min \limits_{S \cap T = \emptyset} |\sum \limits_{x \in S} x - \sum \limits_{x \in T} x|\),我们也可以通过构造方案证明这个下界可以取到。

考虑现在有两个不交的集合 \(S,T\),怎么将其合并为两个集合元素的差。这个很简单,我们每次从两个集合中取出一个数,分别记为 \(x,y\),如果 \(x>y\),那么把 \(x-y\) 扔进 \(S\),反之把 \(y-x\) 扔进 \(T\),每次元素个数至少减少 \(1\),所以这个最小值是可以达到的。

我们现在的问题变成怎么找到这个划分最小值,考虑子集和一共有 \(2^n\) 种,但是本质不同的只有 \(nV\) 种,所以我们只需要取 \(O(\log n)\) 个位置出来跑暴力就一定可以找到解,暴力就好了,复杂度 \(O(V\log n + n)\)

事实上不交这个其实没啥用,我们任意找两个不同的集合差最小即可。哦需要特判一下差一个最小元素的情况,其实就是直接不选了。

\(\text{Submission}\)

*CF2249E2 String (Hard Version)

卡了,我真不会啊,等我啥时候有时间写吧,现在真的好忙好忙好忙。

CF2246F Whoname and Unsorted Array

给定排列 \(p\),定义一次操作可以选择 \(i \in [1,n)\),使得 \([p_1,p_2,\dots,p_n]\) 变成 \([p_i,p_1,p_2,\dots,p_{i-1},p_{i+2},p_{i+3},\dots,p_n,p_{i+1}]\),求使排列有序的方案,不超过 \(4n\) 次操作,或者报告无解。

\(1 \le n \le 5000\)

很纯粹的构造吧。

考虑先按照顺序把所有点扔到最后是好的,如果当前要移动的数位置 \(>1\),直接操作一次即可。

如果当前操作的数为 \(x\),他在开头,我们可以先操作一次 \(2\),再操作一次 \(1\),即 \(x,?,?,1,\dots,x-1 \to ?,x,?,1,\dots,x-1,? \to ?,?,1,\dots,x-1,?,x\)。最后把多余的数从后缀中删掉,即 \(?,?,1,\dots,x-1,?,x \to ?,?,1,\dots,x\)

现在的问题是上述操作需要有至少两个空闲元素,那么我们就将问题变成了 \(n-1,n,1,\dots,n-2\) 或者 \(n,1,\dots,n-1\)

第一种,考虑先把 \(n\) 扔到末尾,然后依次操作 \(n-2,\dots,1\) 使其被扔到开头,然后 \(n-1\) 就自然合法了。

第二种,需要考虑 \(n\) 的奇偶性,如果 \(n\) 是奇数,我们可以反复操作位置 \(2\),使前面 \(1,n\) 反复交换,因为 \(n\) 是奇数,最后会变成 \(1,n,2,\dots,n-1\) 的情况,再把 \(n\) 扔到最后就好了。

反之,如果 \(n\) 是偶数,因为每次操作都会恰好改变 \(n-2\) 对数的相对关系,而 \(n-1\) 是奇数,所以永远不可能。

操作数可以通过。

\(\text{Submission}\)

\(\text{day 5 / 2026.9.8}\)

为啥 2log 能过 2e6...

开场读完题发现 T1 是送的,T2 这个东西直接做就俩老哥,但是三维偏序能优化到 1log 吗???T3,T4 没什么想法。花了一会写完 T2 发现大样例跑不到 1s,求稳想了半天怎么 1log,猜了半天发现只需要对两条边 check,写完发现已经快结束了,五分钟写了 T3 的暴力滚回去上文化课了。

T1

给定 \(n\) 个串,定义 \(f_{i,j}\) 表示前 \(i\) 个串选恰好 \(j\) 个的最长公共前缀,对每个 \(i\)\(\sum f_{i,j} \oplus j\)

\(1 \le n \le 5\times 10^5\)

一堆串的 LCP,自然考虑字典树,答案等价于每次在某一个深度对一个 \(f_{i,j}\) 做 chkmx,延迟下方一下答案就行了,复杂度线性。

加强版 qoj9921

\(\text{Submission}\)

T2

给定长 \(n\) 的颜色序列,每个位置上可能有红黄蓝三种颜色中的一个或多个,定义一个合法段为红色多于黄色,红色多于蓝色,求把序列划分为若干合法段,合法位置的最大数量。

\(1 \le n \le 2\times 10^6\)

2log 凭啥过来着,浪费我一个半小时。

一个很显然的做法,把红变成 \(+1\),黄蓝是 \(-1\),看作 \((红-黄,红-蓝)\) 的二元组,每次查询一个偏序的二元组的 \(\max\),这显然是动态二维偏序,即一个三维偏序,对着做就可以做到 \(O(n\log^2 n)\)

考虑一点性质,对于每个位置 \(i\),决策时,一定会有若干极长的合法段,显然这些合法段只需要取每段最远的一个决策即可,即 \(X_l = X_i\)\(Y_l = Y_i\),注意也可以从开头转移,然后就把三维偏序变成了两个一维的前缀 \(\max\),复杂度 \(O(n\log n)\)

\(\text{Submission}\)

T3

\(n\) 个人,每个人为狼人或村民,狼人不相邻,村民只说真话,狼人可真可假,现在每个人给了一条信息 \((d_i,b_i)\)\(d_i \in \{L,R\}\),表示他左/右有 \(b_i\) 个狼人,给出一种狼人村民的合法状态,使得所有村民的话成立,或者报告无解。

\(1 \le n \le 5\times 10^5\)

(考虑刻画所有可能状态)

好题啊,维护合法总数集合很深刻。

假设狼人数量为 \(K\),我们分讨一下相邻村民的数量关系,即两个村民之间狼人数量为 \(c = i-j-1\)

  • L -> L 那么应该有 \(b_i - b_j = c\)
  • R -> R 那么应该有 \(b_j - b_i = c\)
  • L -> R 那么应该有 \(b_i + b_j + c = K\)
  • R -> L 那么应该有 \(b_i + b_j - c = K\)

考虑对于每个位置维护他是村民时的合法狼人数量集合 \(S\),能够发现这个集合大小只会是全集或者 \(O(1)\) 大小,因为每一对 \(LR\) 村民限制集合大小。(这里具体地好像是大小不超过 \(3\)

然后我们只需要模拟这个过程,维护出每个位置的集合,再反推回去,这题就做完了,复杂度 \(O(n)\)

\(\text{Submission}\)

T4

定义 \(f(b,k)\) 为,\(b\) 为一个数组,\(k\) 为常数,初始有一个空集合 \(S\),对 \(b\) 中每一个元素执行一下操作:

  • \(b_i\) 加入集合。
  • 选择是否将 \(\operatorname{mex}(S)\) 加入 \(S\)

\(2\) 操作最多进行 \(k\) 次,能得到的最大 \(\operatorname{S}\) 即为 \(f(b,k)\),给定 \(a\)\(q\) 次询问,每次给定 \(m,k\) 回答 \(f([a_1,a_2,\dots,a_m],k)\)

\(1 \le n \le 5\times 10^5\)

(考虑维护可能答案)

好题。

首先能发现,所有 \(2\) 操作一定最后 \(k\) 次做的,这样一定不劣。

考虑维护所有未出现的位置 \(b_i\),对于每个 \(k\),维护答案 \(q_k\),最终答案即 \(b_{q_k}\)

对于每个 \(k\),显然有 \(q_k \le q_{k+1} \le q_k+1\),考虑扫描序列维护 \(q_k\)

每次加入一个 \(a_i\),分别考虑其对 \(b_i\)\(q_k\) 的影响,如果之前出现过显然没有影响,否则其一定在 \(b\),记为 \(b_h\)

  • 如果 \(q_k < h\) 显然没有影响。
  • 如果 \(q_k = h\),因为 \(b_h\) 这一位被删了,应该自动移位到下一个,但是因为 \(q_k = h\),所有他没有影响。
  • 如果 \(q_k > h\),所有 \(q_k\) 应该 \(-1\)

所以我们只需要二分找到所有 \(q_k > h\) 的位置,然后做一个后缀减。

然后考虑 \(\operatorname{mex}\) 操作带来的影响,因为多做一次操作 \(q_{k-1}\) 会变成 \(q_k\),并且 \(\operatorname{mex} + 1\),所以有 \(q_{k} \gets q_{k-1} + 1\),做一下全局平移和 \(+1\) 即可,这些都可以用树状数组实现,复杂度 \(O(n\log n)\)

\(\text{Submission}\)

\(\text{day 6 / 2025.9.10}\)

不是为啥大家都会 T3,倒闭了。

早上上了几节文化课去超市买了午饭刚好回来开比赛,T1 拆一下式子跑暴力就好了,然后发现 T2 是奇奇怪怪的计算几何,还要输出分数,认定是大份,先跳了去把 T3T4 暴力写了,感觉 T4 可能的状态很少,写了个爆搜剪枝发现直接把前三个包都过了,回头想 T3,感觉已有区间内部的区间很难算方案,于是就把这个扔到状态里做区间 dp,发现优化后也是 \(O(n^3)\),并且我还是不会第二个包怎么做,红温。回头做 T2,发现超过 2K 就没影响了,分一下块每个块维护个凸包拿来 check,然后取最近的块 check 一下就做完了。写完了同学说直接 check 最近的 4K 个就做完了。。。。。

最后一小时一直在思索怎么优化 dp 做 \(O(n^2)\)

T1

给定序列 \(a\),求 \(\sum \sum \varphi(a_i+a_j)\)

\(1 \le n \le 5000,1\le V \le 10^9\)

考虑 \(\varphi(x) = x \prod \frac{p_i-1}{p_i}\),把每个因子的贡献拆开,发现只需要快速找到 \(V\) 大小的数的所有质因子,考虑把所有数对放一块做这个事。

枚举质数 \(p\),按照 \(\bmod p\) 分类每次拼一下就好了,复杂度应该是 \(O(n^2\log \log V)\)

\(\text{Submission}\)

T2

给定起点在 \((0,a_i)\),终点在 \((T,b_i)\) 的若干条线段,保证每条线段至多与 \(K\) 条线段相交,\(q\) 次查询,每次询问 \(x=c_i\) 时,离 \((c_i,d_i)\) 最近的点的距离。

\(1 \le n \le 10^6,1\le q \le 10^5,1\le K \le 10^3\)

考虑距离 \(2K\) 以外的线段一定有序,于是我们按照 \(2K\) 分块,每块内要找到在 \(x=c_i\) 时的 \(y\) 最大和最小值,于是我们维护上下凸包,每次二分找一下就行了,查询的时候取最近的三个凸包查询即可。

但是你都注意到最近三个凸包就行了,那你为啥不直接找到这个位置然后查询上下 \(2K\) 个点。

\(\text{Submission}\)

T3

给定若干区间 \([l_i,r_i]\),定义一种重排方案是合法的当且仅当每一个前缀区间并都是一个区间,求有多少种合法的重排,对 \(998244353\) 取模。

\(1 \le n \le 6000\)

(状态难以优化考虑推式子优化无用状态)

双倍经验 P11346。不是这咋是个黑,不是咋都场切黑 /ll

好题啊。

考虑一个暴力,发现我们唯一不好区分的是已经完全包含的区间,设 \(f_{l,r,k}\) 表示当前扩展到 \([l,r]\) 了,里面有 \(k\) 个未被使用的完全包含的区间,暴力转移做到 \(O(n^3)\)

考虑我们不能把完全包含区间数量记在状态里,考虑每一次扩展区间的时候,假设我们有 \(m\) 个选择扩展了区间,分别记作 \([l'_1,r'_1],\dots,[l'_m,r'_m]\),这些区间是逐渐变大的,记 \(c_1,\dots,c_m\) 分别表示每个区间内部完全包含的区间数量,考虑概率,因为下一步还有 \(n-c_{i-1}\) 个区间可能改变区间,而我们钦定的改到当前区间的区间只有一个,所以概率为 \(\frac{1}{n-c_{i-1}}\),把所有概率乘起来,答案为 \(\prod (n-c_i)^{-1}\),再乘上所有方案,即 \(\prod \frac{n!}{n-c_i}\),当然这个式子也可以用树拓扑数算出来。

现在这个式子只和扩展的区间相关了,我们就只需要对着每次扩展的区间 dp,设 \(f_{L,R}\) 表示当前区间扩展到 \([L,R]\) 的方案数,按照选择的拓展区间分类,记 \(c_{l,r}\) 表示区间 \([l,r]\) 的数量,\(g_{l,r}\) 表示区间 \([l,r]\) 包含的区间数量:

  1. 假设当前选择扩展到的区间就是 \([L,R]\),那么我们有转移:

\[f_{L,R} \gets c_{L,R}(\frac{1}{n} + \sum \limits_{L \le l \le r \le R} f_{l,r} \frac{1}{n-g_{l,r}}) \]

只需要注意这里不要算上自己就行了,前面的 \(\frac{1}{n}\) 是以 \([L,R]\) 作为开头的情况。

  1. 假设上一步是向左扩展的,即选择的区间是 \([L,r]\),这里 \(r \in (L,R)\)

\[f_{L,R} \gets \sum \limits_{l = L+1}^r f_{l,R}\frac{1}{n-g_{l,R}} \]

  1. 假设上一步是向右扩展的,即选择的区间是 \([l,R]\),这里 \(l \in (L,R)\):

\[f_{L,R} \gets \sum \limits_{r = l}^{R-1} f_{L,r}\frac{1}{n-g_{L,r}} \]

摁着转移是 \(O(n^4)\) 的,加个二维前缀和状物就做到 \(O(n^2)\) 了。

\(\text{Submission}\)

T4

给定长 \(n\) 的序列 \(p\),可以给每个点标号 \([0,2]\),定义一种合法的方案是所有子区间最大值和次大值标号不同,定义一种合法方案的权值为所有子区间前三大标号都不同,求最大权值合法方案。

\(1 \le n \le 5\times 10^5\)

(难以入手从特例考虑性质)

好题,虽然有点 ad-hoc。

考虑观察一点性质,对于一个区间 \([l,r]\),假如区间的最大和次大分别为 \(p_l,p_r\),那么我们再找到第三大值,他的标号一定和这两个点不同,以此类推,我们可以确定这个区间所有点的标号。

因此,我们可以考虑拉出所有前缀最大值和后缀最大值,那么他们之间可以任意标号,标号之后的每个区间内的标号就确定了,记这些位置为 \(q_1,\dots,q_m\),也就是说,如果是数合法方案数的话,此时的方案为 \(3\times 2^{m-1}\)

考虑怎么算区间的贡献,不放假设区间 \([l,r]\) 的最大,次大,第三大的位置分别为 \(x,y,z(x<y<z)\)

  1. 如果此时 \(z\)\(x,y\) 中间,那么这个区间一定合法。
  2. 否则就是第三大在两边,此时只需要看 \(c_z,c_x\) 是否相同。

考虑第二种限制怎么办,相当于对于一对位置 \((i,j)\),有恰好一个 \(k \in (l,r),p_k > \min(p_i,p_j)\),然后找到大于 \(\min(p_i,p_j)\) 的左右第一个位置,分别记为 \(L,R\),那么这个对的贡献为 \((i-L)\times (R-j)\)

考虑怎么对这些可能合法的 pair 算贡献,先减去所有 pair 的贡献,再把可能有贡献的加回来就好了。

对于统计所有的 pair,我们钦定最小值位置 \(i\),然后只需要找向左向右三个数即可。

综上,我们现在只需要确定一种给 \(q_m\) 染色的方案,使得权值最大即可,考虑前后三大最多涉及的就是三个 \(q_i\),于是我们可以暴力枚举相邻三个 \(q_i\) 的颜色,然后对段内暴力染色,取个最大值就好了。

这些问题都可以在 \(O(n)\) 的时间内解决。其实改颜色的时候也不用每次都下去改,提前找出所有 pair,因为每次变颜色左右一定会有一边变色,于是只需要统计 pair 是否相同的对贡献和即可。

\(\text{Submission}\)

\(\text{day 7 / 2026.9.11}\)

CF2239C Revival

有一个未知的排列,记为 \(p_i\),定义 \(s_i = \sum \limits_{x<y \le i} [p_x>p_y]\),现在每个位置给出 \(p_i\)\(s_i\),请你还原出一个初始序列,保证有解。

\(1 \le n \le 2\times 10^5\)

感觉最难的是第一步吧,考虑倒着操作,因为从后往前如果我们确定了后面的点集,那么前面的只需要取个补集就好了,而且我们可以直接算出每个 \(p\) 值而非前缀排名。

考虑相邻两个 \(s_i\) 作差,记 \(S\)\([1,r]\) 的数的集合,那么有:

\[s_r - s_l = \sum \limits_{l < i \le j < r} [p_i > p_j] + \sum \limits_{i=l+1}^{r-1} \sum \limits_{x \in S} [x > p_i] - \frac{(r-l-1)(r-l-2)}{2} + \sum \limits_{x \in S} [x > p_r] - \sum \limits_{i=l+1}^{r-1} [p_i < p_r] \]

前面三个都是常数,只需要维护后面两个式子,注意到这两个都随 \(p_i\) 增大而减小,二分一下即可,复杂度 \(O(n\log^2 n)\)

\(\text{Submission}\)

CF2255E2 What Will Remain at the End? (Hard Version)

给定序列 \(a\),支持四个操作,强制在线:

  1. 区间覆盖
  2. 区间取反
  3. 区间对 \(0\)\(\max\)
  4. 查询之前所有时间,\(p\) 位置形成的序列的最大子段和。

\(1 \le n \le 5\times 10^5,-10^9 \le V \le 10^9\),E1 值域为 \(-1 \le V \le 1\)

首先肯定要维护最大子段和信息,先默认把这个封装了。

考虑 E1,由于值域很小,我们对每一个点,枚举维护他的当前是值 \(v\),那么他下一步加入的信息应该是什么,那么查询时只需要从初始值开始走,看看最终状态是什么样即可,有点类似矩阵。

在一个数未被操作到时,我们想维护他的信息,就需要维护一个极长的时间段,这个时间段内所有信息都是他自己,每次修改时重置这个时间段。那么,我们分别维护当前值是 \(1/0/-1\) 时,这个时间段内的最大子段和信息是什么,每次暴力合并一个节点即可,就代表了这个极长时间段长度增加了 \(1\),扔上线段树维护即可,复杂度 \(O(n\log n)\)

注意我们在做修改操作的时候不要推进时间,具体地实现可以参考代码。

\(\text{Submission}\)

E2 增大了值域,但是我们还是可以沿用之前的思路。每个初始值在覆盖操作之前还是有 \(-1/0/1\) 三种状态,乘上权值维护即可,而在覆盖后,覆盖后的值与初始值无关,也就不需要再维护正负状态终值了,我们直接同一维护覆盖后的状态和即可,在代码中,因为其实 \(0\) 的状态没什么用处,每次查询也都是返回 \(0\) 节点,所以就把 \(0\) 节点变成了在第一次覆盖后的最大子段和和第一次覆盖后的值。

具体实现可以参考代码,感觉口述还是太难以理解了。

\(\text{Submission}\)

CF2257F2 Beaver's Jumping Track (Hard Version)

给定 \(n\) 个段,每个段长 \(l_i\),一次可以跳不超过 \(x\),如果一次跳跃落在了与上次相同的段则有惩罚值 \(s_i\),现在支持三个操作:

  1. 单点修改段长。
  2. 单点修改惩罚值。
  3. 查询从第 \(l\) 个段到第 \(r\) 个段末尾的最小惩罚值。

\(1 \le n \le 10^6,1\le q \le 10^4,1 \le x \le 10\)

注意到 \(x\) 很小,我们直接记从开头多少跳到结尾多余多少,一个 \(x^2\) 的状态,这个状态支持合并,可以扔上线段树,暴力做 \((\min,+)\) 卷积可以做到 \(O(nx^3 + qx^3\log n)\),可以通过 F1。

F2 被卡空间了,考虑一点优化方式,对于每次往一段区间后面加一个点,可以枚举区间左右剩余长度,然后直接算出再走到这个点的右侧的最小值,显然对于走到右侧剩余多少距离的最小代价应该是递增的,我们只需要维护每次跳 \(X\) 最远能跳到哪,然后反过来 \(\text{chkmn}\) 就好了,复杂度降到 \(O(x^2)\),这里可以参考代码的实现方式。

但是这只能支持我们每次往一个区间后加点,而线段树又是区间合并的,于是我们考虑分块,每次暴力重构,但是区间查询还是需要线段树,于是我们底层分块,线段树维护区间信息即可,复杂度 \(O(qx^2B+qx^3\log n)\),空间 \(O(\frac{nx^2}{B})\)\(B\)\(4\) 即可通过,有点卡常。

\(\text{Submission}\)

CF2152G Query Jungle

给定一棵树,每个点有黑白颜色,支持子树翻转,求最小的从根开始的路径数使得可以覆盖全部黑点。

\(1 \le n \le 2.5\times 10^5\)

显然要动态维护虚树叶子数,但是这也太困难了。

考虑维护虚树的括号序,那么一个点是叶子就等价于有一对 (),因此我们只需要维护一堆相邻左右括号即可。

扔上线段树做区间翻转区间合并即可,复杂度 \(O(n\log n)\)

\(\text{Submission}\)

P15534 【MYCOI R1】那猫猫城的集市

给定一棵树,每个点有两个权 \(a_i,b_i\)\(q\) 次查询,以初始权值 \(x\)\(u\) 走到 \(v\),每次走到一个点如果当前权值等于点权中的一个,那么权值会变成另一个,求最终权值是什么。

\(1 \le n \le 10^6\)

秒了,考虑拆成 \(u \to lca,lca \to v\) 两部分。

向上时直接维护当前颜色集合,对每个询问编号连个并查集就行了,合并不同子树时启发式合并。

向下时每次向下和回溯都要交换,直接查询就行了。好像还是得写个 umap,复杂度 \(O(n\log n)\)

\(\text{Submission}\)

P17286 「IXOI R2」Horizon Blue

给定长 \(n\) 的序列 \(a\),支持两个操作,强制在线:

  1. 单点增加。
  2. 查询区间 \([l,r]\) 的所有区间最大值的和。

\(1 \le n \le 2\times 10^5\)

强制在线确定输入数据是什么鬼,还有解码。

好了我看懂了一百万个做法。

一种做法是,考虑直接统计区间内所有 \(\sum a_i(R_i-i)(i-L_i)\),这里 \(L_i,R_i\) 是左右第一个大于的位置,因为 \(a_i\) 不重复,那么只会有前缀最大值和后缀最大值算错了,我们考虑减去他们的共线并重新加上 \(\sum a_i(R_i-i)(i-l+1),\sum a_i(r-i+1)(i-L_i)\) 之类的东西,那么我们需要动态维护 \(L_i,R_i\),每次相当于对左边 \(R_i\) 做 chkmn,对右边 \(L_i\) 做 chkmx,那么我们这样做就行了,同时维护上面的那些贡献和的话,考虑类似机司机的做法,把最大值拆出来就好了。对于前缀和后缀最大值,我们考虑每次单侧递归只有前后缀最大值存在存一下答案即可,复杂度 \(O((n+q)\log^2 n)\)。难写完了吧。

第二种是,考虑分治,显然我们可以把 \([l,r]\) 拆成 \(\log n\) 个分治区间分别处理,那么对每一个分治区间分别考虑,我们需要维护向左向右的 \(\max\),然后每次合并求方案,单点修改相当于左右区间覆盖,带来的共线还是左长度乘右长度,区间 cov 怎么维护一下都可以了吧。

第三种是,考虑操作分块,每次查询时会有 \(O(\sqrt n)\) 个修改点,把这些修改点拉出来,我们需要求得是某一个区间的子区间的最大值和,这个可以做到 \(O(n)\) 预处理 \(O(1)\) 查询,需要写一个 \(O(n)-O(1)\) 的 RMQ,然后对于特殊点来说,找到左右第一个比他大的特殊点和第一个比他大的普通点,就知道了影响范围,然后就可以快速得到贡献了。具体地可能需要仔细拆一下贡献,也有点细节的。

\(\text{Submission}\)

P13841 芳权多

给定一个字符串,支持两个操作:

  1. 把所有 he 子串替换为 she
  2. 把所有 his 子串替换为 her

\(q\) 次询问,每次查询 \(k\) 次操作后第 \(x\) 个字符是什么。

\(1 \le n \le 2\times 10^5,1\le T \le 5\)

考虑缩成形如 hihihihihishihihihihihe 的段,离线扫一下 \(k\) 的变化量每次维护每一段的变化即可,精细实现可以做到 \(O(n\log n)\),感觉有一百万个细节要写。

好我钦定这是大份,懒得写了,扔给 ds 写了份代码。

\(\text{Submission}\)

P13842 篱莘龙

\(n\) 个 argvchs,分别有攻击力 \(a_i\) 和防御力 \(b_i\),两个 argvchs 能分到一组当且仅当其中一个的 \(a_i\) 小于另一个的防御力,求最大分组。

\(1 \le n \le 10^6\)

好题。

把每个 argv 看做区间 \([a_i,b_i]\),当 \(a_i > b_i\) 时反过来。

那么,如果所有区间都 \(a_i < b_i\) 时,显然我们只需要找到一个点使得最多的区间跨过他,换句话说,我们可以对每个区间区间 \(+1\) 全局求 \(\max\) 就是我们的答案。

然后考虑 \(a_i > b_i\) 的情况,显然此时 \([b_i,a_i]\) 必须在所有 \([a_i,b_i]\) 的交集里面才可能会有 \(1\) 的贡献,那么显然,我们不需要撤销某个 \([a_i,b_i]\) 来换 \([b_i,a_i]\),这样一定不优。

那么,现在的问题就变成,维护所有可以被插入一个 \([b_i,a_i]\) 的位置,对所有插入的 \([a_i,b_i]\) 左右端点 \(+1\) 容易判断 \([b_i,a_i]\) 是不是在交集中,而当我们新插入一个 \([a_i,b_i]\) 时,之前的 \([b_i,a_i]\) 可能失效,于是我们只需要找到区间内所有 \([b_i,a_i]\) 左端点在区间外的 \([b_i,a_i]\) 右端点,记一个区间 \(\min\) 每次重复修改即可。

但是我们怎么维护答案呢,区间覆盖是难以撤销的,还不能让复杂度多个 \(\log\)。考虑把 \([b_i,a_i]\) 的归到一个点上,因为此时 \([b_i,a_i]\) 没有来自 \([a_i,b_i]\) 的端点,所以这些点的信息都是相同,于是我们就变成了每次单点修改单点撤销,这个就很好做了。

\(\text{Submission}\)

P16998 【MX-S15-T4】「DLESS-5」Waking Shadows

给定 \(n\) 个区间 \([l_i,r_i]\)\(q\) 次询问,对 \([L,R]\) 内的区间依次执行以下操作:

维护一个初始为空的集合,每次将当前区间与集合并的 \(\operatorname{mex}\) 加入集合。

求最终集合的 \(\operatorname{mex}\)

\(1 \le n \le 5\times 10^4,1\le q \le 5\times 10^5\)

好题啊,我已完全理解。

考虑令 \(S_{l,r}\) 表示第 \(l\) 个到第 \(r\) 个区间操作后形成的集合,那么我们有性质 \(S_{l+1,r} \subset S_{l,r}\),感性理解一下,如果从第 \(l+1\) 个区间操作新增的数为 \(x\),讨论一下:

  • 如果第 \(l\) 个区间加入的不是 \(x\),那么对 \(l+1\) 加入的数没有影响还是 \(x\)
  • 如果第 \(l\) 个区间加入的是 \(x\),那么 \(l+1\) 加入时会加入 \(x+1\),后面的区间也只会在这个基础上延伸,因此一定包含了所有 \(S_{l+1,r}\) 需要的数。

因此结论成立。

由此,我们考虑对 \(R\) 扫描,每次维护所有左端点的情况,设 \(f_x\) 表示数 \(x\) 能够出现的最大 \(L\),先忽略每次加入区间时取并的操作,那么有 \(f_x = R-x+1\)

考虑每次向右移动时 \(R \to R+1\) 时带来的影响,即令 \(f'_0 = R+1,f'_x \gets \min \limits_{i=0}^{x} f_x\)

这个操作可以刻画为,对 \([0,n]\)\(f_x\) 依次操作,初始一个数 \(x = R+1\),依次去判断,如果 \(x > f_x\),就交换,能发现这其实就是 P14400。具体的做法是,考虑我们可以把所有操作扔进一个堆里,依次操作,每次取出最小值看能否与当前值交换,就可以得到每个位置的具体值,而如果不需要知道具体值,显然操作完之后出来的数就是 \(x\) 与经过的数的最大值,于是直接考虑分块即可,对散块每次暴力重构维护每个位置的值,整块只需要知道走完之后是什么,打个标记维护块最大值即可,复杂度 \(O(n\sqrt n\log n)\)

解决了这个之后,再加上区间并就很简单了,只需要对 \([0,l_i-1]\)\([r_i+1,n]\) 分别依次操作即可,复杂度 \(O((n+q)\sqrt n\log n)\)

但是 \(q\) 上还有 \(\log n\) 有点菜了,注意到我们的瓶颈在于重构部分,而本题和回转寿司的区别在于这题的值域很小,于是我们重构的时候开个桶维护数的数量,倒着扫一遍维护最大值即可,复杂度 \(O(n\sqrt n\log n+q\sqrt n)\)

懒了,发现 \(q\) 上带 \(\log\) 也能过。

\(\text{Submission}\)

\(\text{day 8 / 2026.9.12}\)

啥场。前三题一眼了,被 t4 一眼了。前三题不写了。

T4

给定 \(R\times C\) 的网格,给定 \(n\) 个已被标记的点,一次操作可以选择上下左右,然后所有被标记的点标记选择方向上的点,求标记满整个网格需要的最小操作次数。

\(1 \le n \le 300,1 \le V \le 10^9\)

(考虑暴力逐步分析优化)

首先能发现操作顺序和最终结果无关,我们只需要确定每个方向进行多少次操作即可。

考虑暴力枚举上下记作 \(U,D\),然后把每个点扩展成一个长条状,按行扫描,每次只需要维护一行中所有标记点,那么左必须让最左边的点覆盖左边界,右必须让最右边的点覆盖右边界,中间的只需要让左和后加起来满足即可。

记左右分别为 \(L,R\),这一行中所有点为 \(c_1,c_2,\dots,c_m\),那么有:

\[L \ge c_0-1 \]

\[R \ge C-c_m \]

\[L+R \ge \max c_i-c_{i-1}-1 \]

可以对这三个变量分别维护,记第三个为 \(LR\),那么左和右的操作次数即 \(\max(L+R,LR)\),暴力枚举上下,每次 check,复杂度 \(O(R^3n)\),考虑只需要每个点的加入和删除,离散化一下,复杂度 \(O(R^2n^2)\)

每次分别枚举上下太冗余了,我们考虑直接枚举每个点扩展后的长度和,即 \(t = L+R+1\),那么,每次选择上下等价于整个网格在上下移动,而长条不变。

换句话说,我们只需要选出一段长 \(R\) 的行区间,使得其中的左右和最小,由于每次只会新加一行和删除一行,所以我们可以单调队列维护,把每一行的答案扔进队列,复杂度 \(O(Rn^2)\)

然后考虑优化后面那个 \(O(n^2)\),按照这样考虑,每次的长条都固定了长度,那么,对于每对长条来说,在列方向上,他们只有可能交叉或者无交,重叠的情况显然不用考虑。也就是说,我们每一次枚举行的时候,与这一行有交的长条会是一段区间。考虑提前预处理每个区间的长条在一行上的答案,每次就可以 \(O(1)\) 查询了,预处理也是简单的,可以做到 \(O(n^3)\)。于是现在的复杂度变成 \(O(Rn + n^3)\)

考虑这个 \(R\),我们每次枚举所有长度显然是冗余的,因为只有相邻两个长条在某个长 \(R\) 的区间内关系变化时答案才有可能发现变化,所以能发现本质变化次数只有 \(O(n^2)\),现在复杂度就变成 \(O(n^3)\)

记点行坐标为 \(x_i\),那么我们只需要枚举长度 \(|x_i - x_j|,R + |x_i - x_j|,R - |x_i - x_j|\),分别对应,两个长条第一次有交,两个长条第一次占满整个区间,两个长条同时完全占满整个区间。这个我想了很久,应该是这个含义吧。

复杂度 \(O(n^3)\),略微卡常,可以把所有长度拉出来去个重再查询。

\(\text{Submission}\)

\(\text{day 9 / 2026.9.14}\)

后面几个真有题吗。

QOJ18727. Invention of Saruca

给定 \(n\),要求构造 \(2n\) 个互不相同的正整数 \(a_i\),满足 \(1 \le a_i \le 10^9\),并且对于每个 \(k \in [2,n]\),都可以选出一个大小为 \(k\) 的子集,使得子集的和等于总和的一半。

\(1 \le n \le 1000\)

早读直接秒了。

考虑一个简单的做法,我们构造斐波那契数列,最后再放一个用来补和的元素,每次删掉最后一个往前取两个,一定可以构造出来,但是值太大了。

我们以此接着考虑把值域变小一点,一个直观的想法是,在前面放若干 \(1\),每次删掉最后一个 \(x\) 往前取一个 \(x-1\),再在前面拿一个 \(1\),为了不重复,把前面换成 \(1,2,\dots\) 就行了。

注意还会剩下 \(2\) 个空位置,这个可以拿来调和,保证最后调和的那个元素也不会重复,然后就做完了,复杂度 \(O(n^2)\)

\(\text{Submission}\)

QOJ17957. RPS 冒泡排序

给定长 \(n\) 的字符串,有 \(RPS\) 三种字符,分别表示石头剪刀布,现在进行类似冒泡排序的东西,赢的一方如果在前面就交换,从前向后依次做,求 \(T\) 轮之后的字符串长什么样。

\(1 \le n \le 5\times 10^5,1\le T \le 10^9\)

考虑一点简单的性质,如果只有两种颜色,我们对于输的一方,每轮他会向前走一步,那么如果他是第 \(k\) 个输的字符,那么他的位置就会变成 \(\max(i-T,k)\)\(i\) 是他原本的位置。

接着考虑三种颜色的情况,不难发现,我们每次只取两种颜色的极长连续段,进行排序,那么第三种颜色一定不构成影响,然后就做完了,每次选出一个连续段,排一下然后继续选,复杂度 \(O(n)\)

\(\text{Submission}\)

P16968 [SCCPC 2026] 博德之跃 3

给定字符串 \(S\),有三种操作:

  1. 删除 \(S\) 开头字符,加到 \(T\) 末尾。
  2. 删除 \(S\) 末尾字符,加到 \(T\) 末尾。
  3. 删除 \(S\) 开头的一段字符串,使得后缀存在他的反串,并把这个前缀加到 \(T\) 末尾。

\(T\) 的最小字典序。

\(1 \le n \le 5\times 10^5\)

考虑第三种操作其实并没有什么用处,我们每次只需要取开头结尾都有的一个字符,判断他是否需要删除即可。

那么,第三种操作相当于可以减少某种字符的加入,前两种是增加,考虑找到开头结尾向里第一个不同的字符。

如果这两个字符有比开头结尾大的,那么我们就不能减少字符量,因为我们不管怎么决策都会先拿那个小的,然后就不得不去拿大的了,拿就需要让大的前面垫了足够多的字符才是最小的。

于是,我们可以,哪端的字符小,就把那端的字符全删掉,特判两边都小的情况,就做完了,注意精细实现,不然就被卡到平方了,复杂度 \(O(n)\)

\(\text{Submission}\)

CF2233F Shortest GCD Paths

有一张有 \(n\) 个点的无向图,任意两点间边权为 \(\frac{\max(a,b)}{\gcd(a,b)}\),现在给定 \(a,b\),求从 \(a\)\(b\) 的最短路。

\(1 \le n \le 10^9\)

首先能发现,我们可以每次乘除一个质数,代价就是乘除的质数本身,这样操作的次数很少,但不是最优的。

考虑每次我们可以给 \(a\) 除掉某个因数,给 \(b\) 乘上某个因数,这两个因数可能互质,那么就省去了分别乘再加起来的代价。

进一步地,这两个质数一定是互质的时候最优,否则我们把中间这段整体除掉 \(\gcd\) 就会更优。所以,现在一次移动的代价就是这两个因数的 \(\max\)

枚举 \(a,b\) 所有的因数跑个 dp 即可,因为要两个因数相乘 \(\le n\),所以本质数量很少,可以通过。

\(\text{Submission}\)

\(\text{day 10 / 2026.9.15}\)

我还以为爽场。开场猜了 A 的一万个结论,感觉只能这么做,然后写了半个小时,发现和 std 构造一模一样,直接就扔了。然后想了半天 B,感觉只要对着空白点计数就行了,然后只要已知空白点就可以对所有边定向,定向后把边分类,就是森林拓扑序计数,我草怎么做完了。

写完很膨胀啊,去看 C,发现怎么又是 \(\operatorname{mex}\) 状物,D 怎么又是 ds,我擦怎么对标 NOIP2025。看了一会 C 没什么感觉去做 D 了,发现有很多暴力,写了一个小时,把所有包拼上了。最后一小时发现要提前回去上文化课,没时间打 C 的什么非平凡暴力了,平凡的也没打完。

我靠怎么大家都这么会 C。怎么是 aigc 场。

T1

给定字符串,可以选择一个区间翻转,使得翻转之后相邻两个相同字符反复消除,可以把串消空。

\(1 \le n \le 10^6\)

我草,看到翻转,线性,T1,就感觉这题肯定直接有结论乱搞就行了,把所有未匹配位置拉出来,扔掉可以匹配的极长前后缀,剩下的首尾不同,所以一定要翻转,而且必须翻转到中点,模拟一下就行了,复杂度 \(O(n)\)

\(\text{Submission}\)

T2

给定一棵树,每个点有优先级,可以以任意顺序加边,一条边加入时会将连接的两个点中一个染黑,优先染最小的,如果被染了就染另一个,染不了这种方案就不合法,求有多少合法方案,对 \(998244353\) 取模。

\(1 \le n \le 2\times 10^5\)

(考虑从不重复的状态入手,重定向分析)

感觉很自然啊。考虑因为只有 \(n-1\) 条边,所以一定会有一个空白点,对着空白点计数就可以不重不漏了,并且,在空白点确认了之后,所有边怎么定向就知道了。

对于每一条边的所有定向,可以按照是否指向小的分类,显然所有小边可以随便排,大边就需要等到其对应的小边操作之后再操作这个,能够发现一条大边只对应一个小边,也就是树上祖先的那一个,把所有小边删掉剩下的拓扑序就是答案,这个暴力可以 \(O(n^2)\) 完成。

发现这个东西可以换根,做完了。

\(\text{Submission}\)

T3

给定一棵树,可以以任意顺序选择点,每次被选择的点的点权会变成他周围已经被选了的点的点权 \(\operatorname{mex}\),求最终会有多少种本质不同的点权数组,对 \(998244353\) 取模。

\(1 \le n \le 2\times 10^5\)

(mex 考虑数量是否很多,树上指数类东西考虑复杂度分析,容斥,顺着不好去重考虑倒着反推)

很典啊,好题。

考虑每次加点肯定难以去重,考虑直接对一种数组判断能否倒退回一种加点顺序,显然,一种数组一定要满足:

  1. 一条边两边的权值不同。
  2. 如果 \(i\) 的点权为 \(a_i\),那么他的所有邻居必须包含 \(1,2,\dots,a_i-1\)

必要性显然。充分性考虑每次按照点权从小到大赋值,一定可以得到这样的数组,所以这是充要条件。

接着有一个经典结论,在这种条件下,树的 \(\operatorname{mex}\) 不超过 \(\log n\),证明显然。

于是考虑,我们只需要钦定父亲的颜色,设:

  • \(A_{x,c}\)\(x\) 颜色为 \(c\) 时所有儿子提供所有 \(1,2,\dots,c-1\) 的方案。
  • \(B_{x,c,p}\)\(x\) 颜色为 \(c\),父亲颜色为 \(p\) 时,所有儿子提供 \(\{1,2,\dots,c-1\} \setminus \{ p \}\) 时的方案,儿子此时可以选 \(p\)

每次合并儿子做完全背包状物可以做到 \(O(n^2)\)

这里 gemini 给了一种剪枝办法,预处理每个点子树内能处理出的最大 \(\operatorname{mex}\)\(g_x\)。点 \(x\) 在合并所有儿子先按照 \(g\) 从小到大排序,如果一个点不能不选,并且当前已有值的所有背包值的并集都有这个值,直接打乘法标记,否则将这个值加入。这样避免了反复加入相同小颜色的情况,复杂度可以分析到 \(O(n\log^3 n)\),怎么分析的忘了,虽然但是他还是过了。

算了还是写一下,能发现 \(\sum 2^{g_x} = O(n\log n)\),这个证明类似 dsu on tree,分析轻重边经过次数即可,那么上述做法的瓶颈其实在于枚举父亲颜色和每个颜色都需要做一次转移,多了两个 \(\log\)

题解的一种 2log 做法是考虑容斥,定义一个孩子的总选择数为 \(Q_{y,c} = \sum \limits_{d< c}A_{y,d} + \sum \limits_{d>c}B_{y,d,c}\),再定义容斥 \(P_S = \prod (Q_{y,c} - \sum \limits_{d \in S} A_{y,d})\) 表示去掉集合 \(S\) 里面颜色的决策后的方案,每次容斥转移即可:

\[A_{x,c} = \sum \limits_{S \subseteq \{1,2,\dots,c-1\}} (-1)^{|S|} P_{S} \]

\[B_{x,c,p} = \sum \limits_{S \subseteq \{1,2,\dots,c-1\} \setminus \{p\}} (-1)^{|S|} P_{S} \]

就不是 \(k\) 次枚举所有情况了,只需要按照 \(g\) 排序后,每次扩展当前所需的颜色,就可以做到严格 \(\sum 2^{g_x}\) 的复杂度了,复杂度 \(O(n\log^2 n)\)

好像有 1log 做法了来着,忘了,就写这个吧。

\(\text{Submission}\)

T4

给定序列 \(\{a\}\),定义一个区间 \([l,r]\) 是好的,当且仅当能找到一个分界点 \(k \in [l,r)\),使得 \([l,k]\)\((k,r]\) 构成的不可重集相同,求有多少个好区间。

\(1 \le n \le 10^6\)

(去重考虑第一次出现位置,区间数数考虑刻画极小区间)

我说 T4 <<< T3 有感觉吗。

发现这个问题有两个难点,一个是怎么找不可重集划分相同的区间,一个是怎么对这些区间去重。

类似某个 \(\operatorname{mex}\) 题,忘了是哪个了。考虑找到所有极小的合法区间,显然,如果我们固定一个左端点的话,每个左端点只取第一个合法的区间右端点,就是所有需要的极小区间了。

统计的时候,把所有极小区间扩展为矩形,求个矩形并就好了,因为这些矩形很特殊,所以不需要真的写个矩形并上去。

能够说明这样是不重不漏的,因为做的是矩形并,显然不会重,也不会漏,对于一个合法区间,我们一定会找到其中的一个出现位置,并扩展到他,因为他合法,所以他里面一定也有至少一个合法区间,他就一定可以被数到了。

找到极小区间是简单的,考虑对枚举的每个左端点 \(l\) 找到左端点的下一次出现位置 \(x\),那么 \([1,x-1]\) 中的数集就是这个极小区间的数集,我们找到右侧第一个不在这个区间内的,以及这些数的第三次出现位置,我们的右端点一定要在这个范围内,这是一个显然,而极小区间的右端点就是数集内所有数第二次出现位置的最大值,这些都是可以简单维护的。倒着扫描,拿个 BIT 维护即可,复杂度 \(O(n\log n)\)

考虑我们已经找到了所有极小区间,因为在上述过程中我们已经维护出了极大区间的右端点,我们再正着扫一遍,就找到了极大区间的左端点,即极小区间为 \([l_i,r_i]\),极大区间为 \([L_i,R_i]\)

我们就可以按照极大区间分类,因为任意极大区间一定无交,其中的所有极小区间直接按照 \((l_i - l_{i-1})(R-r_i+1)\) 计数即可,这部分都是简单的了。

总复杂度 \(O(n\log n)\),极小区间这个思路很自然吧,很人类了,原题解什么阴。

\(\text{Submission}\)

\(\text{day 11 / 2026.9.17}\)

啥。这 T2 咋是 AI 出的。

T1

给定一个长 \(n\) 的环序列,每个点有权值 \(a_i\),一次操作可以花费 \(c_i\) 的代价将 \(a_i,a_{i+1},\dots,a_{i+k-1}\) 全部 \(-1\),求最终使得所有数变成 \(0\) 的最小代价。

\(1 \le n \le 2\times 10^5\)

很棒的刻画啊,做起来很顺手。

显然考虑差分数组,要解决的问题一个是怎么把差分数组变成 \(0\),一个是环排列差分后和初始差一个偏移量,这个偏移量怎么办。

考虑令 \(i \to (i+k) \bmod n\),整个序列变成若干单向环,环上顺序的两个位置一次操作可以 \(+1,-1\),这个显然取哪个为起点答案都一样,所以顺着跑两边算出贡献即可。

对于偏移量,如果 \(k \mid n\),那么显然我们只需要找出 \(c_i\) 和最小的一个环然后操作 $\Delta $ 次就好了。

但是如果不整除,那就是说一个环每次贡献不是取得完整的 \(n\),每次可能多出来一条,显然这个也是可以算的,乘上一个 \(\frac{\gcd(n,k)}{k}\) 的系数即可。

\(\text{Submission}\)

T2

给定一个长 \(n\) 的字符串 \(T\),处理 \(q\) 次询问,每次取出 \(S=T[1 \dots m]\)

  • 初始令 \(U=S\)
  • 进行 \(k-1\) 次操作,每次选择一个 \(l\),使得 \(S\)\(l\) 的前缀和 \(U\)\(l\) 的后缀相同,在 \(U\) 的后面接上 \(S[l+1\dots m]\)

可以选择 \(l=0\),求最终能得到多少种本质不同的 \(U\),对 \(998244353\) 取模。

\(1 \le n,k \le 10^6,1 \le q\le 10^5\)

(去重可以考虑刻画重复状态的类似结构)

结论比 sale 难,数数方式比 sale 难。

通过手玩或者打表,我们能发现问题其实在于怎么对于所有 border 的拼接去重。

进一步地,继续手玩,我们可以(?)发现对于会算重的 border 其实都是由最小的一个循环节拼接而成的,其余所有都不会被算重。

比如 aabaabaa,这个东西只在 baabaabaa 会被算重,因为其他的都可以区分,这个结论是能证的,后面忘了。

于是我们可以把 border 分成两类,一种是可区分的,一种是由最小循环节拼接而成的,记最小循环节为 \(X\),即上述的 baa,那么他的出现次数最大就是 \(a = \frac{|T|}{|X|}\),于是考虑我们 \(k-1\) 次操作干了什么:

  • 选择添加最长循环节 \(a\)\(X\).
  • 添加 \(b\) 个可区分的串中的任意一个。
  • 添加 \(i \in [0,a)\)\(X\),但是后面必须接上一个可区分串或者直接结束。

这样钦定的原因是,任意多个非最长循环节拼起来,一定可以被几个最长循环节加至多一个非最长所表示,所以我们只取第一个能被表示的。

这样的话,记 \(f_{i,0}\) 表示下一位是否需要结束或者接可区分串,转移为:

\[f_{i,0} = (b+1)f_{i-1,0} + bf_{i,1} \]

\[f_{i,1} = (a-1)f_{i-1,0} \]

答案为 \(\sum \limits_{i=0}^{k-1} f_{i,0} + f_{i,1}\),但是显然我们算多了。

考虑无法用 \(k-1\) 个串拼出来的,即段数 \(< k-1\) 的,我们只需要拿最小循环节 \(X\)\(b\) 个可区分串来表示,即 \(\sum \limits_{i=0}^{k-2} (b+1)^i\)

然后就做完了吧,多次询问的话上个矩阵快速幂就行了,复杂度 \(O(n+q\log k)\)

这个结构刻画的还是很棒的。

\(\text{Submission}\)

T3

给定排列 \(p_i\),如果两个点 \(i<j\) 满足 \(\max \limits_{k=i+1}^{j-1} p_k < \max(p_i,p_j)\),则连一条有向边 \(i \to j\),显然有 \(i \to i+1\)

多次询问,每次支持操作:

  1. 交换两个点 \(p_i,p_j\)
  2. 求从 \(i\) 出发到 \(j\) 的路径数,对 \(998244353\) 取模。

\(1 \le n,q \le 2\times 10^5\)保证排列,操作都均匀随机

(区间 \(\max\) 相关限制要考虑笛卡尔树上操作,维护子树计数信息可以考虑维护一次函数)

唯一人类题,唯一传统题。

场上其实有点没敢往笛卡尔树想,对笛卡尔树的性质还是太不了解了。

考虑随机排列的笛卡尔树,其实就是个 Treap,所以我们可以用 split 和 merge 来维护树形态,第一个操作很自然的就可以做到单 \(\log\) 了。

于是只需要考虑在笛卡尔树上怎么维护路径数,对于一次操作,先令 \(v_i = 1\),就是表示他是起点,然后对每一个子树考虑方案数,记从子树表示区间的左侧传入的方案数为 \(w\),那么到子树内每个点都有一个初始的 \(w\) 方案,显然经过这个子树后,\(w\) 会翻若干倍,再加上了这个子树本身再产生的方案,换句话说,这个子树的方案一定可以被表示为一个一次函数 \(f_x(w) = k_xw + b_x\),我们考虑维护每个子树的系数 \(k\)\(b\)

\(d_x\) 表示到这个点的方案数,显然有 \(d_x = w + f_L(w) + v_x\)。下放路径时,我们先走左子树,再看有多少方案走上来了,再走到右子树,传给左子树的路径数是 \(w\),给右子树的是 \(w+d_x\),于是有 \(f_x(w) = f_L(w) + d_x + f_R(w+d_x)\),整理一下系数就可以得到:

\[k_x = 2k_L + 1 + (k_L+2)k_R \]

\[b_x = 2b_L + v_x + (b_L + v_x)k_R + b_R \]

于是就可以暴力维护出所有子树的系数了,每次带入即可。

查询时,我们从根出发,依次走到 \(j\),最后求出 \(d_j\) 即可,显然只需要便利一条树链,复杂度 \(O((n + q)\log n)\)

\(\text{Submission}\)

T4

给定一棵根为 \(1\) 的树,求有多少种拓扑序,使得不存在原树长为 \(k+1\) 的链被连续选到,注意这里的链头必须是链尾的祖先。

\(1 \le n \le 4000\)

传统在哪,容斥系数怎么编的。

这种东西很难刻画啊,考虑容斥,维护一个容斥系数 \(c_i\),我们希望有:

\[g_i = \left\{\begin{matrix} 1 & i \le k\\ 0 & i > k \end{matrix}\right. \]

\(G(x) = \sum \limits_{i \ge 0} g_ix^i,C(i) = \sum \limits_{i \ge 1} c_ix^i\),那么,因为要满足 \(g_i = \sum \limits_{j=1}^i c_jg_{i-j}\),我们推一下式子:

把递推式左右乘 \(x^i\),那么有:

\[\sum \limits_{i \ge 1} g_ix^i = \sum \limits_{i \ge 1}\sum \limits_{j=1}^ic_jg_{i-j}x^i \]

那么等价于:

\[G(x) - 1 = C(x)G(x) \]

所以有:

\[G(x) = \frac{1}{1-C(x)} \]

同时考虑,因为 \(G(x) = 1 + x + x^2 + \dots + x^k\),所以有:

\[G(x) = \frac{1-x^{k+1}}{1-x} \]

因为 \(G(x) = \frac{1}{1-C(x)}\),所以有 \(C(x) = 1 - \frac{1}{G(x)}\),进而有:

\[C(x) = 1 - \frac{1-x}{1-x^{k+1}} = \frac{1-x^{k+1} - 1 + x}{1-x^{k+1}} = \frac{x - x^{k+1}}{1-x^{k+1}} = x(1 - x^k)\sum \limits_{i \ge 0}x_i(k+1) \]

所以,我们可以得到:

\[c_i = \begin{Bmatrix} 1 & i \equiv 1 \pmod {k+1} \\ -1 & i \equiv 0 \pmod {k+1} \\ 0 & \text{otherwise} \end{Bmatrix} \]

好了我们终于编出来了这个容斥系数,接着就可以 dp 了。

考虑我们可以把拓扑序上的连续段看做对原树做链划分,那么选择这些链的方案数就是划分后新树的拓扑序,于是这启发我们需要记录子树内划分了多少链,当前链长是多少,状态就出来了,设 \(f_{x,i,j}\) 表示 \(x\) 这个点,子树内划分了 \(i\) 条链,接上来的链长 \(j\) 的划分方案。

因为树的拓扑序是 \(\frac{m!}{\prod siz_i}\),于是我们把每个 \(\frac{1}{siz}\) 扔到每个划分点上去计算,但是这个系数必须乘在一条链结算的时候,于是我们记 \(g_{x,i}\) 表示 \(x\) 点划分 \(i\) 条链,并且已经结算,那么有 \(g_{x,i} = \frac{f_{x,i,1} - f_{x,i,0}}{i}\)

做合并时,有三类转移,不连上来,连上来一条链后别的子树合并,连上来一条链,即:

\[g'_{x,i+j} \gets g_{y,i}g_{x,j} \]

\[f'_{x,i+j,r} \gets g_{y,j}f_{x,i,r} \]

\[f'_{x,i+j,(r+1)\bmod {k+1} } \gets f_{y,j,r}g_{x,i} \]

最后还要处理一些细节什么的,比如这个点新开一条链,不过都是简单的。

复杂度 \(O(n^2K)\),考虑优化。

其实显然,如果划分的链太多了本质不同的链长就很少,显然只有 \(\lfloor \frac{siz_x}{i}\rfloor\) 种,这里原题解是加了个偏移量 \(siz_x - i +1\),然后只需要维护连续数组,好像有不需要加偏移量的做法,但是是不是有点麻烦了,算了就这样吧,剩下的和原题解一样,改写一下转移精细实现空间就行了,还是挺难写的,对着 ds 写的 std 写了一份代码。

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

\(\text{Submission}\)

\(\text{day 12 / 2026.9.18}\)

怎么难飞了,随机补题。

CF2025F Choose Your Queries

给定长 \(n\) 的全 \(0\) 数组,\(q\) 次操作,每次操作选择 \(x_i\)\(y_i\),进行 \(+1\)\(-1\),求最终所有数非负并且数组和最小的构造方案。

\(1 \le n \le 3\times 10^5\)

建边,把这个无向图的一颗生成树拉出来,考虑为每条边定向,被指向的点黑白染色,这也不好做,考虑先钦定一个方向,然后变成是否选择都翻转。

这个是简单的,在生成树上每次让子树尽可能全为白即可,返祖边显然不用动,这样是一定能构造出最优解的。

\(\text{Submission}\)

CF2045L Buggy DFS

给了一段代码,看原题面吧。

考虑怎么构造出奇数,经过人类智慧,必须要一个环才可能合法,于是有 \(11\) 的构造:

1 2
1 3
2 3
2 4

然后只需要考虑偶数了,对于 \(\le 31700\)\(K\),直接构造一条 \(\frac{K}{2}+1\) 的链即可。

考虑更大的 \(K\),我们继续在这条链上做手脚,考虑一个点的贡献就是他之前遍历到的点乘他的度数,那么我们直接在链外拉一些相互独立的点,让他们最后被访问,设额外点的度数为 \(k\),那么他的贡献为 \(k^2+k\),显然这个最小是 \(2\),一定是可以构造出合法解的,然后就做完了。

\(\text{Submission}\)

QOJ18965. 最小异或乘积

定义一个排列的代价为 \(\prod (a_i \oplus a_{i-1})\),求代价最小的排列。

\(1 \le n \le 2\times 10^6\)

考虑 \(2^n\) 时答案就是格雷码,但是更大了这个难以扩展。

虽然但是,这也给了我们一点启发,我们肯定是让相邻两个位置差的位数最小,但是这还不够,我们也不能让高位差的太多次。

于是先只考虑最低位,肯定是 \(k,k+1\) 分一组,那么,我们这样捆绑分组,就变成了 \(\frac{n}{2}\) 的子问题,假设我们已经得到了 \(\frac{n}{2}\) 的子问题的最优解,那么我们只需要变换一下对内的奇偶性,就可以构造出最优解。

但是,\(n\) 可能是奇数,也就是有一个对不满,我们考虑找到 \(\frac{n}{2}\) 中其对应的位置,以他为起点,向两侧做奇偶构造即可,复杂度 \(O(n\log n)\)

\(\text{Submission}\)

AT_agc030_c [AGC030C] Coloring Torus

\(K\) 种颜色,定义一个合法的矩阵,当且仅当任意一对颜色 \((i,j)\),每个颜色 \(i\) 周围都有相同数量的 \(j\),注意这里的周围是可循环的,给出 \(n\times n\) 矩阵的构造。

\(1 \le n \le 500,1\le K \le 1000\)

考虑 \(K \le 500\) 时,构造是简单的,我们每一行放同一种颜色即可。

考虑进一步地,我们怎么把剩下 \(500\) 种颜色插进去,一种朴素的想法肯定是刚才的基础上,每种颜色间隔着放,类似:

1 2 1 2
3 4 3 4
5 6 5 6

可是当 \(K\) 是奇数时,显然会有一行是放不了的,我们考虑优化这个东西,让每一个数都有下一行至少两个位置,于是,我们能够想到把矩阵斜过来:

5 3 1
2 5 4
3 1 5

不难发现这样就解决了上面的问题,我们也放进了 \(2n\) 种颜色。

\(\text{Submission}\)

AT_agc025_d [AGC025D] Choosing Points

有一个 \(2n\times 2n\) 的矩阵,要求选出 \(n\times n\) 个点,使得其中任意两个点的距离既不是 \(\sqrt {D1}\),也不是 \(\sqrt {D2}\)

\(1 \le n \le 2\times 10^5\)

考虑黑白染色,但是如果出现三个点相互距离都是 \(D\) 的情况怎么办。

仔细分析一下,因为我们是整格点,所以这种情况并不存在,具体地,我们按照 \(D = 2^p \times a\)\(a\) 分类:

  1. \(a = 1\),此时两个点的横坐标一奇一偶,按照 \(i+j\) 染色即可。
  2. \(a = 2\),此时两个点横坐标奇偶性相同,按照 \(i\) 染色即可。
  3. \(a = 3\),这种情况不存在,因为每个点至多贡献 \(0\)\(1\)

综上,这张图是二分图,按照 \(D1,D2\) 分别染色即可,显然一定会有一个集合 \(\ge n^2\) 个点。

\(\text{Submission}\)

P5441 【XR-2】伤痕

构造一张图,图中有 \(n\) 条无向边,\(\frac{n(n-1)}{2}-n\) 条有向边,使得选择四个点,在只经过这四个点的情况下强联通,这样的点对数量最多。

\(1 \le n \le 99\)

啥题,这咋想到的,让我偷个懒。

题解

\(\text{Submission}\)

\(\text{day 13 / 2026.9.20}\)

因为初赛延迟了一天,哎不是你怎么初赛也犯蠢啊,如此成绩,如何 CSP。

妈的,记得看空间记得看空间记得看空间记得看空间记得看空间记得看空间记得看空间记得看空间记得看空间记得看空间记得看空间记得看空间记得看空间记得看空间记得看空间记得看空间记得看空间记得看空间记得看空间记得看空间记得看空间记得看空间记得看空间记得看空间记得看空间记得看空间记得看空间记得看空间

T1

给定平面若干底边在 \(y=0\) 上向右的三角形,求他们的面积并的二倍。

\(1 \le n \le 3\times 10^5\)

单调栈,打个偏移量做完了。

\(\text{Submission}\)

T2

数轴上有 \(n\) 个补给点和检查点,每次到达一个新的补给点 \(+1\),到达检查点可以选择 \(-1\) 检查,求检查所有检查点的最小代价。

\(1 \le n \le 10^5\)

不懂哦,写了个 dp 讨论了几种情况换成 BIT 就冲过去了。

哦哦第一种情况其实不用 dp,是一定没用的,后面的就可以直接拆贡献了。

\(\text{Submission}\)

T3

\(n\) 个字符串,每个选一个非空后缀依次拼起来,求最小字典序。

\(1 \le n \le 2\times 10^6\)

考虑倒着拼,每次只需要枚举一个后缀然后比较是否更小即可,二分哈希。

\(\text{Submission}\)

T4

给定长 \(n\) 的序列,\(q\) 次操作是将区间 \([l,r]\) 异或上 \(x\),一种序列的贡献是 \(\sum \limits_{1 \le l \le r \le n} (\sum \limits_{i=l}^r a_i)^2\),求对于 \(2^q\) 种修改情况的贡献和,对 \(10^9+7\) 取模。

\(1 \le n \le 1000,1 \le q \le 10^5,1\le V \le 128\)

哎哎拆贡献好像有点没拆明白。

场上有点没想明白拆位怎么搞,于是就直接按对拆了,每次乘一个对的系数,这样就只需要考虑每个对的变化。

注意到对于一个点的异或方案可以拿线性基搞出来,每次消元,然后暴力枚举,需要同时记录包含两个位置,只包含其中任意一个的,暴力枚举可以做到 \(O(n^2q + nV^3)\),过了 92。

感觉正解更舒服一点,考虑二进制拆位,我们只需要算对的贡献和不同位对的贡献即可,同时枚举对的位置和对的位对,拆成概率,乘个贡献系数即可,那么还是刚才对的三种情况,只不过现在的系数贡献分别是 \(\frac{1}{4},\frac{1}{2}\),然后暴力做就行了,复杂度 \(O(n^2q + n^2\log^2 V)\)

第一个还是太慢了,考虑瓶颈在找到两个位置都包含的,变成矩阵加法即可,复杂度 \(O(q\log^2 V + n^2\log^2 V)\)

\(\text{Submission}\)

\(\text{day14 / 2026.9.21}\)

题单 div2 吗 /yiw

QOJ17959. 石子 2

给定 \(n\) 个重 \(a_i\) 的石子,石子有黑白颜色,一次可以移除一个石子,当前仅当移除的石子左右都有石头并且与它颜色不同,获得分数 \(a_i\),求所有 \(n!\) 种移除方案的得分之和。

\(1 \le n \le 3\times 10^5\)

一看就很数学吧,考虑对每个石子算出其贡献方案,设当前石子为 \(i\),左边第一个贡献的非同色石子为 \(j\),右边第一个贡献的非同色石子为 \(k\),那么对 \(i\) 来说,他的贡献为:

\[\sum \limits_{j < i < k} 2a_i \binom{n}{k-j+1}(k-j-2)!(n-k+j-1)! = n! \sum \limits_{j < i < k} a_i \frac{2(k-j-2)!}{(k-j+1)!} \]

暴力枚举 \(j,k\) 或者左右卷积长度,可以做到 \(O(n^2\log n)\),还是太菜了。

考虑把所有 \(a_i\) 同时考虑进贡献式子,具体的,我们设 \(c_i\) 为颜色数组,\(g(x) = \frac{2(x-2)!}{(x+1)!}\),那么有:

\[n! \sum \limits_{i < j < k} c_i(1-c_j)c_ka_jg(k-i) \]

考虑固定 \(i,k\),整理式子:

\[n! \sum \limits_{i < k} c_ic_k g(k-i)\sum \limits_{j=i+1}^{k-1} (1-c_j)a_j \]

记前缀和 \(p_i = \sum \limits_{j=1}^{i} (1-c_j)a_j\),并且因为 \(i,k\)\(j\) 不同色对 \(p\) 无贡献,所以可以写成:

\[n! \sum \limits_{i < k} c_ic_k g(k-i)(p_k - p_i) \]

拆开整理式子:

\[n! (\sum \limits_{i < k} c_kp_k g(k-i)c_i - \sum \limits_{i < k} c_kc_ip_ig(k-i)) \]

\[n! (\sum \limits_{k} c_kp_k \sum \limits_{i < k} c_ig(k-i) - \sum \limits_{k} c_k \sum \limits_{i < k} c_ip_ig(k-i)) \]

两个和 \(i,k\) 相关的式子都可以直接卷积了,剩下的直接算就行了,复杂度 \(O(n\log n)\)

\(\text{Submission}\)

AT_agc032_d [AGC032D] Rotation Sort

给定排列 \(a\),一次操作可以花费 \(A\) 选择一个区间左移一位,或者花费 \(B\) 选择一个区间右移一位,求使得 \(a\) 排序的最小代价。

\(1 \le n \le 5000,1 \le V \le 10^9\)

首先能够感觉到,区间位移这个操作很强,我们对每个位置肯定只需要操作一次,并且一次就能放到最终位置。

考虑枚举所有不动的点,这必须要是一个上升子序列,然后我们只需要对其他点判断左移还是右移即可:

  1. 如果后面的不动点比当前值小,选择左移。
  2. 如果前面的不动点比当前值大,选择右移。

其实就能直接 dp 了吧,设 \(f_i\) 表示前 \(i\) 个数排序的最小代价,每次倒着枚举 \(j\),可以统计处区间内 \(> a_i\) 的数的个数,这些都需要左移,而右移的其实并不需要统计,因为我们钦定区间所有数必须左移或者右移,多操作的数可以在划分子序列的时候被数进来,所以复杂度 \(O(n^2)\)

\(\text{Submission}\)

CF1913F Palindromic Problem

给定小写字符串,可以任意修改其中一个位置为任意字符,求可以让回文子串数量最大化的修改方案。

\(1 \le n \le 3\times 10^5\)

啥大份。

奇偶回文是本质相同的,这里只讨论奇回文,偶回文只需要删掉中间可能选到回文中心点的情况即可。

下面讨论一下回文中心和当前点位置的不同关系,没说的话默认回文中心在当前点右侧,左侧同理:

  1. 原串上回文中心恰好扩展到这个点。考虑只有选到与回文中心另一侧相同的字符才会扩展字符串,而每个回文中心只会被数 \(O(1)\) 次,每次只需要二分哈希判一下最长延长长度即可,复杂度 \(O(n\log n)\)

  2. 原串上回文中心扩展过了这个点,考虑扫描线,再进入这个回文串的时候加入长度个回文子串,每次删除一个,这个是容易做的,虽然但是,好像二阶差分一下就行了。

  3. 原串上回文中心就是这个点,直接数这个点的最长回文长度即可。

  4. 回文中心走到了左侧,继续扫描线,每次回文子串增加一个,走到终点删除。

所以写一个马拉车加二分哈希即可,复杂度 \(O(n\Sigma + n\log n)\)

实在是讨论的有点多了,让 D 老师帮忙写了一份带注释的代码。

\(\text{Submission}\)

CF1946F Nobody is needed

给定排列 \(a\)\(q\) 次询问,每次给定 \(l,r\),求以下任意长度的 \(t\) 序列的数量。

  1. \(t_i \in [l,r]\)
  2. \(t_i < t_{i+1}\)
  3. \(a_{t_i} \mid a_{t_{i+1}}\)

\(1 \le n,q \le 10^6\)

很有意思的题。

考虑肯定先把每个点合法的转移画出来,形成一个 DAG,每次在这个区间的导出子图上跑就可以得到答案。

这种东西肯定不好直接数数,考虑差分,我们怎么把区间 \([l,r]\) 的答案拆分到 \([1,l-1]\)\([1,r]\) 上。

发现这个事情并不能直接做,比如 2 4 8,如果只对 4,8 查询的话,\(2\) 带来的方案数贡献就会在 \(4\) 多贡献一次给 \(8\)

考虑去掉这些重复计算,因为所有方案数都是加法计算的,我们考虑拆贡献,对每个点把它对后续的所有影响都找出来。

具体地,只有 \(x \mid y\)\(y \mid z\) 时,\(x\) 才会多贡献一次给 \(z\),那么,我们可以先把 \(x\) 的所有倍数的导出子图拿出来,暴力跑出来所有方案,就是 \(x\) 的所有贡献了,对每个数都这么做,让每个导出子图相互独立,最后再把方案数相加,就可以得到答案,而且每个点的贡献独立了。

考虑这么做的复杂度,因为这个 DAG 的总边数为 \(O(n\log n)\),类似 \(x \mid y\)\(y \mid z\) 的三元组本质只有 \(O(n\log^2 n)\) 个,所以暴力枚举复杂度是 \(O(n\log^2 n)\) 的。

然后只需要扫描线,差分一下,拿树状数组维护即可,复杂度 \(O(n\log^2 n)\),不过这两个 \(\log\) 都很小,可以通过。

\(\text{Submission}\)

QOJ18298. 单色树

给定一棵树,点有黑白,定义树的代价为满足以下条件的 \((u,v)\) 的数量:

  1. \(u,v\) 是祖先关系。
  2. \(u,v\) 均为黑色。

对于所有 \(k \in [0,n]\),求树上有 \(k\) 个黑色节点时的最小代价。

\(1 \le n \le 2\times 10^5\)

?晚自习做的时候还以为我读错题了。

考虑每次增加一个叶子,肯定是选择子树大小最小的一个增加,并且不会选择子树内还有白点的增加,显然不优,就做完了?

\(\text{Submission}\)

CF2233E2 Permutation Transmission (Difficult Version)

对于一个排列,其会被拆分为 \(\lceil \log_{2}(n+1)\rceil\) 个字符串发送,即每个数二进制下的每一位拼成的字符串。现给定若干被打乱的字符串,求有多少种初始排列使得可以发送出这些字符串。

\(1 \le n \le 2\times 10^5\)

是不是就看你敢不敢猜来着。

考虑所有字符串的 \(1\) 数量一定按照位数单调不降,那么,对于相邻两个 \(1\) 数量相同的串,在一定合法的情况下,他们是可以任意交换的,那么答案就是所有相同 \(1\) 个数字符串的排列。

考虑怎么判不合法:

  1. 不能出现相同数字
  2. 每一位的 \(1\) 个数组成的集合要与排列的相同。
  3. 不能有一定大于 \(n\) 的数字。

然后就做完了。

\(\text{Submission}\)

CF1916E Happy Life in University

给定一棵树,点有颜色,定义 \(g(x,y)\) 表示 \(x,y\) 路径上不同颜色数,求最大的 \(f(x,y) = g(x,\operatorname{lca})\times g(y,\operatorname{lca})\)

\(1 \le n \le 3\times 10^5\)

啥题。

考虑每个点的贡献范围,显然是去掉其子树与他相同颜色点的子树,那么,我们只需要维护与他同色的所有点的位置,每次子树 \(+1\),这些子树再 \(-1\),就可以维护路径长度了。

具体找同色点,可以一遍 dfs,区间 \(+1-1\)\(\max\) 上线段树即可,复杂度 \(O(n\log n)\)

\(\text{Submission}\)

\(\text{day 15 / 2026.9.22}\)

T1

给定字符串 \(S\),选择两个子串使得他们的异或值最大,可以重叠。

\(1 \le n \le 10^7\)

显然其中一个要选择第一个 \(1\) 开始到结尾,考虑下一个一定至少要填了下一个 \(0\)

但是直接拿第一个 \(1\) 覆盖第一个 \(0\) 死了,比如 11010,所以我们要选择第一段刚好覆盖不到下一个 \(1\) 的位置。

复杂度 \(O(n)\)

\(\text{Submission}\)

T2

一个环,相邻点连边,边有边权 \(L_i\),选定一个根,\(d_i\) 为从根开始到 \(i\) 的最短路长度,现在你可以在任意两个点之间连任意非负实数长度路径,有 \(m\) 条路径,从 \(X_i \to Y_i\),代价为 \(d_{X_i} - d_{Y_i}\),求使得 \(m\) 条路径和代价和最大是多少。

\(1 \le n \le 5\times 10^5,1\le V \le 10^6\)

不是怎么一百万个人场切黑。

考虑任意实数边的刻画,手玩一下可以发现,我们可以把所有 \(d_i\) 改成任意值,前提是要满足 \(d_1=0,d_i \ge 0,|d_i-d_{i-1}| \le L_i\),摁着这个 dp 我们就能获得多项式做法了。

考虑这个条件还是太困难了,但是注意到,我们对 \(d_i\) 整体加一个常数,对答案的贡献是不变的,因为路径是差分贡献的。

于是,我们可以发现,只需要要求 \(|d_i - d_{i-1}| \le L_i\),然后钦定 \(d\) 最小的一个为根即可。我们令 \(w_i = d_i - d_{i-1}\),那么有 \(|w_i| \le L_i,\sum w_i = 0\),考虑每个 \(w_i\) 带来的贡献。

\(a_i\) 表示路径差分后的数组,\(s_i\)\(a_i\) 的后缀和,那么一种选法的答案 \(\sum s_iw_i\)

考虑把每条边拆成 \(L_i\)\(+1\)\(-1\),即 \(+s_i\)\(-s_i\),把这些数排序后做正负匹配,使得刚好选出相同数量的正负数即可。

直接做的话复杂度 \(O(nV\log n)\)

\(\text{Submission}\)

发现这个东西容易扔到值域线段树上,每次线段树二分,单点修改,区间查询。

代码挺短的,复杂度 \(O(n\log V)\)

\(\text{Submission}\)

T3

给定一个 \(01\) 字符串,一次操作可以翻转一个

T4

posted @ 2026-09-04 11:49  Wei_Han  阅读(32)  评论(1)    收藏  举报