2026.10 做题记录 1

2026.10.3

P6758 [BalticOI 2013] Vim

首先删去一个 \(e\) 一定会花费 \(2\) 的代价,且一个 \(e\) 要被删除的话它后面那个位置一定要被经过。

那么把满足 \(s_i \ne e \land s_{i-1}=e\) 的 \(i\) 标记在删除所有 \(e\) 后,问题变成给定一个字符串,每次可以:

  1. 花费 \(1\) 的代价向左走一步。
  2. 花费 \(2\) 的代价向右走到第一个某字符的位置。

要求所有被标记点都被经过。

显然,一个点最多被跨过(经过)不超过 \(3\) 次。

定义状态函数 \(f_{i,c}\) 为经过一次 \(i\),想要走到 \(i\) 后面第一个 \(c\) 的最小代价。

定义状态函数 \(g_{i,c_1,c_2}\) 为经过三次 \(i\),是从后面第一个字符 \(c_1\) 走到 \(i\) 的,想要再走到后面第一个字符 \(c_2\) 的最小代价。

记 \(st_i = 1\) 表示 \(i\) 被标记。

对于 \(f\):

  1. 不经过 \(i\),且 \(i-1\) 是向右走的。要求 \(s_i \ne c \land st_i = 0\)。\(f_{i,c}\gets f_{i-1,c}\)。
  2. 经过 \(i\),且 \(i-1\) 是向右走的。\(f_{i,c}\gets f_{i-1,s_i}+2\)。
  3. 经过 \(i\),且 \(i-1\) 是 \(i\) 先向左走再向右走的。向右走时不经过 \(i\)。要求 \(s_i \ne c_2\)。\(f_{i,c_2}\gets g_{i-1,s_i,c_2}+2\)。
  4. 经过 \(i\),且 \(i-1\) 是 \(i\) 先向左走再向右走的。向右走时经过 \(i\)。\(f_{i,c}\gets g_{i-1,s_i,s_i}+4\)。

对于 \(g\):

  1. \(i-1\) 向右走,然后再向左走到 \(i\),再从 \(i\) 向右。要求 \(s_i \ne c_1\)。\(g_{i,c_1,c_2}\gets f_{i-1,c_1}+1\)。
  2. \(i-1\) 向右走走到 \(i\),继续向右走,然后再向左走到 \(i\),再从 \(i\) 向右。\(g_{i,c_1,c_2}\gets f_{i-1,s_i}+3\)。
  3. \(i-1\) 向右走,然后再向左走到 \(i\),再从 \(i\) 向左。要求 \(s_i \ne c_1,s_i\ne c_2\)。\(g_{i,c_1,c_2}\gets g_{i-1,c_1,c_2}+1\)。
  4. \(i-1\) 向右走走到 \(i\),继续向右走然后再向左走到 \(i\),再从 \(i\) 向左。要求 \(s_i\ne c_2\)。\(g_{i,c_1,c_2}\gets g_{i-1,s_i,c_2}+3\)。
  5. \(i-1\) 向右走走到 \(i\),继续向右走然后再向左走到 \(i\),再从 \(i\) 向左,再向右时走到 \(i\),然后继续向右。\(g_{i,c_1,c_2}\gets g_{i-1,s_i,s_i}+5\)。
  6. \(i-1\) 向右走,然后再向左走到 \(i\),再从 \(i\) 向左,再向右时走到 \(i\),然后继续向右。要求 \(s_i \ne c_1\)。\(g_{i,c_1,c_2}\gets g_{i-1,c_1,s_i}+3\)。

时间复杂度 \(O(n|\sum|^2)\)。

AT_stpc2025_1_c Sum of Three Inversions

记 \((A_i,B_i,C_i)=(a,b,c)\)。

\((1,2,3)\to (3,1,2)\to (2,3,1)\to (1,2,3),(1,3,2)\to (3,2,1)\to(2,1,3)\to(1,3,2)\) 后得到两个环。

对于任意前后两对 \((a_1,b_1,c_1),(a_2,b_2,c_2)\),有:

  1. \((a_1,b_1,c_1)=(a_2,b_2,c_2)\)。产生 \(0\) 个逆序对。
  2. \((a_1,b_1,c_1)\) 下一个状态是 \((a_2,b_2,c_2)\)。产生 \(2\) 个逆序对。
  3. \((a_1,b_1,c_1)\) 下一个状态不是 \((a_2,b_2,c_2)\)。产生 \(1\) 个逆序对。

对这两个环分开 DP。

定义状态函数 \(f_{x,y,z,c}\) 为有 \(x\) 个 \(1\),\(y\) 个 \(2\),\(z\) 个 \(3\),逆序对数量为 \(c\) 且三元组均属于一个环的序列数量。分情况讨论:

  1. 加入一个 \((1,*,*)\)。\(f_{x+1,y,z,c+2y+z}\gets f_{x,y,z,c}\)。
  2. 加入一个 \((2,*,*)\)。\(f_{x,y+1,z,c+2z+x}\gets f_{x,y,z,c}\)。
  3. 加入一个 \((3,*,*)\)。\(f_{x,y,z+1,c+2x+y}\gets f_{x,y,z,c}\)。

初始化 \(f_{0,0,0,0}=1\)。

再将两个环合并。枚举第一个环有 \(x_1\) 个 \(1\),\(y_1\) 个 \(2\),\(z_1\) 个 \(3\)。可知第二个环有 \(X-x_1\) 个 \(1\),\(Y-y_1\) 个 \(2\),\(n - X-Y-z_1\) 个 \(3\)。产生 \((x_1+y_1+z_1)(n-x_1-y_1-z_1)\) 个逆序对。则贡献为:\(\sum\limits_{c}^{}f_{x_1,y_1,z_1,c}f_{X-x_1,Y-y_1,n-X-Y-z_1,K-c-(x_1+y_1+z_1)(n-x_1-y_1-z_1)}\binom{n}{x_1+y_1+z_1}\)。

时间复杂度 \(O(n^5)\)。

P16906 [CCO 2026] Walking on a Graph

根据题目定义,可以发现 \(u\to v\) 与 \(v\to u\) 颜色相反。

把一条合法路径中的 \(1,2\) 复制一遍,变成形如:\(1 \leadsto 2, 2\leadsto1, 1\leadsto 2\dots, 1\leadsto 2\)。

由 \(u\to v\) 与 \(v\to u\) 颜色相反的基础性质,可以发现 \(1 \leadsto 2\) 翻转一下就是一条合法的 \(2\leadsto 1\) 路径;\(1 \leadsto 1\) 将起点终点改一下一下就是 \(2 \leadsto 2\)。

那么一条合法的路径可以看作是若干 \(1 \leadsto 2\) 的路径选出一些翻转,若干 \(1 \leadsto 1\) 的路径修改起点终点然后全部拼起来得到的。

连读段 DP。定义状态函数 \(f_{i,a,b,c,d}\) 为考虑完 \([3,i]\),得到 \(B\leadsto B,B\leadsto W,W\leadsto B ,W\leadsto W\) 的路径分别有 \(a,b,c,d\) 条时的方案数。

首先如果 \(i\) 不插入。有 \(f_{i,a,b,c,d}\gets f_{i-1,a, b,c,d}\)。

如果 \(i\) 要插入,记 \(v = f_{i-1,a,b,c,d}\),分情况讨论:

  1. \(c_i = B\)。

    1. 单独成一段。

      \[f_{i,a+1,b,c,d}\gets v \]

    2. 插在一段的开头。

      \[f_{i,a,b+1,c,d-1}\gets v\times d\\ f_{i,a+1,b,c-1,d}\gets v\times c \]

    3. 插在一段的末尾。

      \[f_{i,a,b,c,d}\gets v\times a\\ f_{i,a,b,c,d}\gets v\times c \]

    4. 插在两段中间。

      \[f_{i,a-1,b+1,c,d-1}\gets v\times a\times d\\ f_{i,a,b,c-1,d}\gets v\times c \times d\\ f_{i,a,b,c-1,d}\gets v\times a\times c\\ f_{i,a,b,c-1,d}\gets v\times c\times (c-1) \]

  2. \(c_i = W\)。转移差不多:

    \[f_{i,a,b,c,d+1}\gets v\\ f_{i,a-1,b,c+1,d}\gets v\times a\\ f_{i,a,b-1,c,d+1}\gets v \times b\\ f_{i,a,b,c,d}\gets v\times b\\ f_{i,a,b,c,d}\gets v\times d\\ f_{i,a,b-1,c,d}\gets v\times a\times b\\ f_{i,a-1,b,c+1,d-1}\gets v\times a\times d\\ f_{i,a,b-1,c,d}\gets v\times b\times(b-1)\\ f_{i,a,b-1,c,d}\gets v\times b\times d \]

最后因为 \(1 \leadsto 2\) 的路径经过颜色一定形如 \(B \to W \leadsto W \to W\);\(1 \leadsto 1\) 的路径经过颜色一定形如 \(B\to W \leadsto B \to B\)。所以有 \(x\) 条 \(1 \leadsto 2\) 路径和 \(y\) 条 \(1 \leadsto 1\) 路径的方案数就是 \(f_{n,0,0,y,x}\)。还有可能出现 \(1\to 2\) 的路径,这个直接枚举数量。

定义 \(g_{a,b,c,d,e}\) 为有 \(a\) 条 \(1 \leadsto 2\) 的路径,\(b\) 条 \(2 \leadsto 1\) 的路径,\(c\) 条 \(1 \leadsto 1\) 的路径,\(d\) 条 \(2 \leadsto 2\) 的路径,\(e\) 条通用路径,将它们排在一起且同种路径不能相邻,开头和结尾都需要是 \(1 \leadsto 2\) 的路径的方案数。

那么答案为 \(\sum\limits_{c=0}^{n}\sum\limits_{x=0}^{n}\sum\limits_{y=0}^{n}\sum\limits_{a=0}^{x}\sum\limits_{b=0}^{y} f_{n,0,0,y,x}\times x!\times y!\times \times g_{a,x-a,b,y-b,c}\)。

对于 \(g\),再开两维 \(0/1\) 表示当前结尾与是否是通用路径。

时间复杂度 \(O(n^5)\)。

AT_utpc2023_p Priority Queue 3

定义状态函数 \(f_{i,j,k,0/1}\) 为考虑完前 \(i\) 个操作,\([i+1,n+m]\) 中 \(Y\) 的最大值为 \(A_j\),当前优先队列中有 \(k\) 个元素在之后要被删除且均不超过 \(A_j\),\(A_j\) 是否在队列中的方案数。

记 \(c_i\) 为前 \(i\) 个操作中 \(+\) 操作的数量,\(d_i\) 为前 \(i\) 个操作中 \(-\) 操作的数量。

  1. 是 \(+\) 操作。
    1. 加入一个不会被删除的数。对于之前的 \(+\) 操作,会被删除且已经被删除的值中大于 \(A_j\) 的数量等于 \(m-j\)(因为这些元素一定在前面都被删了);会被删除且还没有被删除的值中大于 \(A_j\) 的数量等于 \(0\);不会被删除的值一定大于 \(A_j\),有 \(c_{i-1}-d_{i-1}-k\) 个。那么此时可以填的数有 \(n - A_j - (c_{i-1}-d_{i-1}-k)-(m-j)\)。有 \(f_{i,j,k,c}\gets f_{i-1,j,k,c}\times (n-A_j-(c_{i-1}-d_{i-1}-k)-(m-j))\)。
    2. 加入一个会被删除的数。
      1. 这个数是 \(A_j\)。\(f_{i,j,k+1,1}\gets f_{i-1,j,k,0}\)。
      2. 这个数不是 \(A_j\)。\(f_{i,j,k+1,c}\gets f_{i-1,j,k,c}\)。
  2. 是 \(-\) 操作。
    1. \(Y_i\ne A_j\)。\(f_{i,j,k-1,c}\gets f_{i-1,j,k,c}[k > c]\)。
    2. \(Y_i = A_j\)。此时要求队列只剩下一个可弹出的元素。枚举接下来的最大值为 \(A_{j'}\)。前 \(i-1\) 个操作的 \(+\) 操作中,所有不会被删除的数都确定了值,有 \(c_{i-1}-d_{i-1}-k\) 个;已经被删除且确定了的值有 \(m-j+1\) 个。那么剩下的 \(+\) 操作数量为 \(c_{i-1}-(c_{i-1}-d_{i-1}-k)-(m-j+1)\)。方案数为 \((c_{i-1}-(c_{i-1}-d_{i-1}-k)-(m-j+1))^{\underline{j-j'-1}}\)。有 \(f_{i,j',0,0}\gets f_{i-1,j,1,1}\times (c_{i-1}-(c_{i-1}-d_{i-1}-1)-(m-j+1))^{\underline{j-j'-1}}\)。

初始化 \(f_{0,m,0,0}=1\)。答案为 \(f_{n+m,0,0,0}\)。时间复杂度 \(O(n^3)\)。

HDU6854 Kcats

定义状态函数 \(f_{l,r,x}\) 为遍历到 \(l-1\) 时,单调栈中有 \(x\) 个不可能删除元素时,区间 \([l,r]\) 满足条件的排列 \(p_{1\sim r-l+1}\) 的数量。

枚举 \(1\) 的位置为 \(k\)。那么 \(a_k = -1\) 或 \(a_k = x+1\)。有 \(f_{l,r,x}\gets f_{l,k-1,x}\times f_{k+1,r,x+1}\times \binom{r-l}{k-l}\)。

初始化 \(f_{l,l+1,x}=1\)。答案为 \(f_{1,n,0}\)。时间复杂度 \(O(n^4)\)。

QOJ18927 Multiples

记 \([l_i,r_i]\) 为是 \(A_i\) 倍数的区间。那么限制形如:\(l_{Q_i}>P_i\)。

注意到如果 \([l_i,r_i]\) 和 \([l_j,r_j]\) 有交,那么把 \(r\) 较小的增大是依然合法的。则最优解一定是区间两两不交或包含的关系。

定义状态函数 \(f_{l,r}\) 为只考虑所有 \([l_i,r_i]\subseteq [l,r]\) 的最大价值和。

维护辅助数组 \(g_{l,r,k}\)。有 \(g_{l,r,k}=\max\limits_{k'=l-1}^{k-1}g_{l,r,k'}+(r-l+1)+f_{k'+1,k-1}\)。

\(f_{l,r} \gets g_{l,r,k}+f_{k+1,r}\)。

时间复杂度 \(O(n^4)\)。

2026.10.4

QOJ7793 雷同

对合并过程建树。

那么代价等于 \((\sum\limits_{i=1}^{n}w_i\times dep_i) + (\sum\limits_{x\in S}^{}2^{len_x})-(n-1)\)。其中 \(S\) 是除了根所在的长链外所有长链构成集合,\(len_x\) 为 \(x\) 这条长链的长度。

考虑先固定 \(dep_{1\sim n}\),最小化 \(\sum\limits_{x\in S}^{}2^{len_x}\)。

一层一层加点。对于深度为 \(k\) 的点,分成两类:叶子和非叶子。

如果将 \(w_i\) 从大到小排序,那么这棵树是一个左偏的结构。证明是简单的。

那么对于每一层,从左往右一定先是非叶子,然后是叶子。由于最左边的点一定是最长链,所以如果以左儿子优先的方式长链剖分,从左往右第 \(i\) 个点的长链长度就恰好是 \(\text{lowbit}(i-1)\)(除了第一个点)。

那么就可以 DP 了。

对这棵树从上往下枚举层。定义状态函数 \(f_{i,j}\) 为当前已经将 \(w\) 值前 \(i\) 大的点当作叶子加入,对于当前一层来说还有 \(j\) 个点可能是叶子。

从右往左确定每个点是否是叶子。

  1. 这个点是叶子。\(f_{i+1,j-1}\gets f_{i,j}+2^{\text{lowbit}(j-1)}\)。特别的,令 \(2^{\text{lowbit}(0)}=0\)。
  2. 这个点不是叶子。那么前面的点都不是叶子。进入下一层,点数翻倍。\(f_{i,2j}\gets f_{i,j}+\sum\limits_{x=i+1}^{n}w_x\)。

初始化 \(f_{0,1} =0\)。答案为 \(f_{n,0}\)。

时间复杂度 \(O(n^2)\)。

UTS Open '21 P7 - April Fools

给定一个长度为 \(n\) 且互不相同的序列 \(a_{1\sim n}\)。问有多少个排列 \(p_{1\sim n}\),使得对于 \(i\in [1,n)\) 都满足 \(a_{p_i}>a_{p_{i+1}}\) 或 \(|\text{highbit}(a_{p_i})-\text{highbit}(a_{p_{i+1}})|=1\)。

将 \(a_i\) 从小到大排序。那么随着 \(i\) 增大,\(\text{highbit}(a_i)\) 不减。

定义状态函数 \(f_{i,a,b,c}\) 为插入完 \(1\sim i\),有 \(a\) 个段的末尾元素 \(\text{highbit}\) 为 \(\text{highbit}(a_i)\),\(b\) 个段为 \(\text{highbit}(a_i)-1\),\(c\) 个段不超过 \(\text{highbit}(a_i)-2\)。显然,\(c \le 1\)。因为如果 \(c\ge 2\),则一定有一个段在之后会通过其末尾与某个元素合并,此时一定不满足 \(|\text{highbit}(a_{p_i})-\text{highbit}(a_{p_{i+1}})|=1\)(后面加的数严格大于这个段末尾元素)。

插入 \(i\) 时:

  1. 如果 \(\text{highbit}(a_i) = \text{highbit}(a_{i-1})+1\)。此时 \((a,b,c)\) 先变成 \((0,a,b+c)\),再考虑插入 \(i\) 对段的影响。\(\text{highbit}(a_i) > \text{highbit}(a_{i-1})+1\) 同理。
  2. \(i\) 插入后,其左边可能是空、某个结尾为 \(\text{highbit}(a_i)-1\) 的段;其右边可能是空、某个结尾为 \(\text{highbit}(a_i)\) 的段、某个结尾为 \(\text{highbit}(a_i)-1\) 的段、某个结尾不超过 \(\text{highbit}(a_i)-2\) 的段。共 \(6\) 种情况,分别转移即可。

最后答案为 \(\sum\limits_{a+b+c=1}^{}f_{n,a,b,c}\)。时间复杂度 \(O(n^3)\)。

AT_agc049_e [AGC049E] Increment Decrement

先考虑确定 \(A_{1\sim n}\) 时怎么求代价。

因为初始均为 \(0\),所以可以考虑从小到大枚举 \(h\),每次将 \(A_i \ge h\) 的抬高到 \(h\),\(A_i < h\) 的不变。

这样做的正确性在于,一个从 \(0\) 增加到 \(x\) 的数,一定对任意 \(i\in [1,x]\),都经历了从 \(i-1\) 抬高到 \(i\) 的过程。而对于 \(i\in [x+1,+\infin)\),如果将它抬高 \(1\) 就一定需要降低 \(1\),等价于不改变其高度。

此时可以默认 \(a_i = \min(A_i,h-1)\)。目标是让 \(A_i \ge h\) 的 \(a_i\) 增加 \(1\)。

定义状态函数 \(f_{i,0/1}\) 为考虑完 \([1,i]\),且处于 \(i\) 的操作是否是操作 \(2\) 的最小代价。有:

\[f_{i,0}=\min(f_{i-1,0},f_{i-1,1})+[A_i\ge h]\\ f_{i,1}=\min(f_{i-1,0}+c,f_{i-1,1})+1-[A_i\ge h] \]

最终代价为 \(\min(f_{n,0},f_{n,1})\)。

记 \(\delta_i = f_{i,0}-f_{i,1}\)。那么 \(f_{i,0} = f_{i,1}+\delta_i\)。有:

\[f_{i,0}=f_{i-1,1}+\min(\delta_{i-1},0)+[A_i\ge h]\\ f_{i,1}=f_{i-1,1}+\min(\delta_{i-1}+c,0)+1-[A_i\ge h]\\ \delta_i = \min(\delta_{i-1},0)-\min(\delta_{i-1}+c,0)+2[A_i\ge h]-1 \]

而 \(\min(f_{n,0},f_{n,1}) = \sum\limits_{i=1}^{n}\min(f_{i,0},f_{i,1})-\min(f_{i-1,0},f_{i-1,1})\)。有:

\[\min(f_{i,0},f_{i,1})-\min(f_{i-1,0},f_{i-1,1})\\ =(f_{i,1}+\min(\delta_i,0))-(f_{i-1,1}+\min(\delta_{i-1},0))\\ =f_{i-1,1}+\min(\delta_{i-1}+c,0)+1-[A_i\ge h]+\min(\delta_i,0)-f_{i-1,1}-\min(\delta_{i-1},0))\\ =\min(\delta_{i-1}+c,0)+1-[A_i\ge h]+\min(\delta_i,0)-\min(\delta_{i-1},0)) \]

那么就只需要在意 \(\delta_i\) 了。

注意到当 \(\delta_{i}>1\lor \delta_{i}<-c-1\) 时,\(\delta_{i}\) 是无用的。那么实际有效的状态就只有 \(O(c)\) 个。

将所有 \(B_{i,j}\) 离散化,对于相邻两个值 \((x,y)\) 来说,\(h\in (x,y]\) 的代价都是相同的。因为在 \(A_{1\sim n}\) 确定时 \([A_i\ge h]\) 是一致的。此时有 \(O(nk)\) 个等价 \(h\) 类。

枚举这些等价 \(h\) 类。记 \(c_i\) 为 \(A_i < h\) 的方案数,\(d_i\) 为 \(A_i\ge h\) 的方案数(也就是 \(k-c_i\))。定义状态函数 \(dp(i,\delta)\) 为考虑完 \([1,i]\),当前 DP 过程中 \(\delta_i = \delta\) 的方案数。

记 \((x,v)\) 分别表示 \([A_i \ge h]\) 及其方案数(也就是 \((0,c_i)\) 或 \((1,d_i)\))。转移为:

\[\delta'=\min(1,\max(-c-1,\min(\delta,0)-\min(\delta+c,0)+2x-1))\\ dp_{i, \delta'}\gets dp_{i-1,\delta}\times v\\ ans\gets dp_{i-1,\delta}\times v\times(\min(\delta+c,0)+1-x+\min(\delta',0)-\min(\delta,0)))\times D\times k^{n-i} \]

其中 \(ans\) 为最终答案,\(D\) 为枚举的这个等价 \(h\) 类实际包含的 \(h\) 数量。初始化 \(dp_{0,-c}=1\)。

时间复杂度 \(O(n^2kc+nk\log(nk)+n^2k^2)\)。

CF1111D Destroy the Colony

如果没有 \(x,y\) 的限制。

记 \(cnt_i\) 为字符 \(i\) 的数量。那么答案等于 \(\frac{(\frac{|s|}{2}!)^2}{\prod\limits_{x}^{}cnt_x!}\times F\)。其中 \(F\) 为合法的方案数。

显然 \(F\) 等价于选一个字符集合 \(S\),使得 \(\sum\limits_{x\in S}^{}cnt_x = \frac{|s|}{2}\) 且 \(\min\limits_{x\in S}^{}cnt_x \ge 1\) 的方案数。

定义状态函数 \(f_{i}\) 为考虑到当前字符,\(S\) 中 \(cnt\) 之和为 \(i\) 的方案数。那么转移为从大到小枚举 \(i\),并更新 \(f_{i}=f_i +f_{i-cnt_{x}}\)。

最后 \(F = f_{\frac{|s|}{2}}\)。

如果有 \(x,y\) 的限制。因为只会改变 \(cnt_{x},cnt_y\)。所以这个背包回退掉 \(x,y\) 的贡献然后加上 \(x,y\) 合并的贡献就可以了。回退方式为从小到大枚举 \(i\),并更新 \(f_{i}=f_{i}-f_{i-cnt}\)。

时间复杂度 \(O(|\sum||s|+|\sum|^2|s| + q)\)。

2026.10.5

P17588 UTVPI

对于每个 \(i\),记 \(x_{(i,+1)},x_{(i,-1)}\) 分别表示 \(x_i,-x_i\)。

限制 \(x_{(d,a)}+x_{(e,b)}\le c\) 可以写成:

  1. \(x_{(d,a)}\le x_{(e,-b)}+c\)。
  2. \(x_{(e,b)}\le x_{(d,-a)}+c\)。

这是差分约束的形式。跑最短路得到一组解,记这组解为 \(y\)。

发现 \(y\) 实际上是有问题的,因为它并没有保证 \(y_{(i,+1)}+y_{(i,-1)}=0\)。

将两个不等式相加,有:

\[y_{(d,a)}+y_{(e,b)}\le y_{(d,-a)}+y_{(e,-b)}+2c\\ \frac{y_{(d,a)}+y_{(e,b)}-y_{(d,-a)}-y_{(e,-b)}}{2}\le c\\ \]

目标是:

\[x_{(d,a)} +x_{e,b} \le -x_{(d,a)}-x_{(e,b)} +2c\\ x_{(d,a)} + x_{(e,b)} \le c \]

发现此时只需要让 \(x_i = \frac{y_{(i,+1)}-y_{(i,-1)}}{2}\) 就行了。

但 \(y_{(i,+1)}-y_{(i,-1)}\) 不一定是偶数。

设 \(x_i = \frac{y_{(i,+1)}-y_{(i,-1)}}{2} + \delta_i\)。因为 \(\frac{X}{2}\) 在 \(X\) 是偶数时一定是整数,在 \(X\) 是奇数时一定可以写成 \(Y+0.5\)。对于一个限制 \(x_{(d,a)} + x_{(e,b)} \le c\),其调整值接受范围为 \(S =c -\frac{y_{(d,a)}+y_{(e,b)}-y_{(d,-a)}-y_{(e,-b)}}{2}\ge 0\),且 \(S \in \{0,1,2,\dots\}\cup \{0.5,1.5,2.5\dots\}\)。所以直接取 \(\delta_i \in \{-0.5,0,0.5\}\) 即可。

先把偶数的解确定了。对于 \(i\),拆成两个状态 \((i,+),(i,-)\),分别表示 \(x_i =\frac{y_{(i,+1)}-y_{(i,-1)}}{2} +0.5,x_i=\frac{y_{(i,+1)}-y_{(i,-1)}}{2}-0.5\)。建立 2-SAT 模型。

有如下限制:

  1. 对于 \(i\) 自己。\((i,+),(i,-)\) 中只能选择一个。
  2. 对于一个限制 \(x_{(d,a)} + x_{(e,b)} \le c\)。记 \(S =2c -(y_{(d,a)}+y_{(e,b)}-y_{(d,-a)}-y_{(e,-b)})\),分情况讨论:
    1. \(S\ge 2\)。此时怎么选都可行。
    2. \(S = 1\)。此时不能同时选 \((d,+),(e,+)\)。
    3. \(S = 0\)。此时不能同时选 \((d,+),(e,+)\)。同时如果 \(d\) 的值确定且 \(e\) 的值没确定,不能选 \((e,+)\);如果 \(e\) 的值确定且 \(d\) 的值没确定,不能选 \((d,+)\)。

特殊说明一下,这里 \((d,+)\) 是乘上 \(a\) 之后 \(\delta_d = 0.5\) 的那个状态,而不是开始定义的那个。

然后跑 2-SAT 即可。时间复杂度 \(O(nm)\)。

P17597 「RiOI-8」桜羽 エマ

\(ans_u = \sum\limits_{\substack{v\in\operatorname{subtree}(u)\\v\ne u}}^{}a_v w_{dep_v - dep_u}\)。

直接长剖。维护每个深度 \(a\) 的和。对于每个 \(u\) 在长链上面算答案。发现这样对于一个 \(v\),它会在它所在长链链头父亲所在长链的对应深度节点上面加一个 \(a_v\),但这个 \(a_v\) 对链上深度处于 \([dep_{top_v},dep_{v}]\) 的点是没有贡献的。算完 \(v\) 所在长链的所有贡献后再在这条链上对应位置减去即可。

相当于给定一个长度为 \(m\) 的序列 \(b_{1\sim m}\),对每个 \(i\) 求 \(\sum\limits_{j> i}^{}b_j w_{j-i}\)。将 \(b\) 序列翻转,变成 \(\sum\limits_{j>i}^{}b_{(m-j+1)}w_{j-i}\)。也就是 \(\sum \limits_{x + y = m - i + 1}^{}b_xw_y\)。直接卷积即可。

因为长链的和为 \(n\)。所以整体复杂度 \(O(n\log n)\)。

QOJ17412 序列支配

记 \(d_i = a_i - b_i\)。那么 \(d_i\) 确定时合法的 \((a_i,b_i)\) 有 \(m-|d_i|\) 对。

记 \(u_i = v_i - \sum\limits_{j=i+1}^{n}v_j\)。那么 \(u_i\) 可以取任意非负整数。

\(\sum\limits_{i=1}^{n}d_i v_i=\sum\limits_{i=1}^{n}d_i(u_i + \sum\limits_{j=i+1}^{n}v_j) = \sum\limits_{i=1}^{n}(w_i+d_i)u_i\)。对于 \(w_i\),满足:

  1. \(w_0 = 0\)。
  2. \(w_i = 2w_{i-1}+d_{i-1}\)。

问题变成求序列 \((a,b)\) 的数量,使得 \(w_{i}\) 均不小于 \(0\)。

因为 \(d_i \in [1-m,m-1]\)。当 \(w_{i-1}\ge m\) 时 \(2w_{i-1}+d_i \ge 2m +(1-m) = m+1 > m\)。所以之后就一定满足条件了。

那么定义状态函数 \(f_{i,w}\) 为考虑完前 \(i\) 个数,\(\min(m,2w_i+d_i)=w\) 的方案数。

有:

  1. 对于 \(w < m\)。\(f_{i,\min(m,2w+d)}\gets f_{i-1,w}\times (m-|d|)[w+d \ge 0]\)。
  2. 对于 \(w = m\)。\(f_{i,w}\gets f_{i-1,w}\times m^2\)。

第二个转移是简单的。

对于第一个转移,有:

\[f_{i,x}\gets \sum\limits_{y\le x}^{}f_{i-1,y}\times (m - |x - 2y|)[x<m]\\ f_{i,m}\gets \sum\limits_{w=0}^{m}f_{i-1,w}\sum\limits_{d= \max(-w,m-2w)}^{m}(m-|d|) \]

第二个也是简单的。暴力枚举 \(w\) 是 \(O(m)\) 的。

第一个可以前缀和优化。时间复杂度 \(O(m)\)。

整体时间复杂度 \(O(nm)\)。

2026.10.6

AT_arc231_e Odd Inversion

对 \(b_{i-1},b_i\) 的关系分类:

  1. \(b_i > b_{i-1}\) 且 \(b_i > A_{i-1}\)。此时 \(i\) 一定不会产生逆序对,因为 \(b_i\) 是前缀 \(\max\)。
  2. \(b_{i}> b_{i-1}\) 且 \(b_i \le A_{i-1}\)。此时 \(i\) 会产生一些逆序对。
  3. \(b_i < b_{i-1}\)。此时 \(i\) 会产生逆序对。
  4. \(b_i = b_{i-1}\)。此时 \(i\) 产生的逆序对数量等于 \(i-1\) 产生的逆序对数量。

对于情况 \(2,3\) 来说,\(i\) 具体产生多少逆序对是无法确定的。但可以注意到,在固定 \(b_{1\sim i-2}\) 的情况下,任意一对满足 \(b_{i}<b_{i-1}\) 的 \((b_{i-1},b_{i})\) 在交换 \(b_{i-1},b_i\) 后都唯一对应了一组 \(b_{i}>b_{i-1}\) 且 \(b_i\le A_{i-1}\) 的 \((b_{i-1},b_i)\)。且交换后逆序对数量减少 \(1\)。

这启发我们对逆序对数量的奇偶差进行计数。

定义状态函数 \(f_{i}\) 为 \(b_{1\sim i}\) 的所有情况中,逆序对为奇数的方案数减去逆序对为偶数的方案数。此时情况 \(2,3\) 就抵消了,只需在意情况 \(1,4\)。有:

  1. \(b_i > b_{i-1}\) 且 \(b_i > A_{i-1}\)。\(f_i \gets f_{i-1}\times (A_i-A_{i-1})\)。
  2. \(b_i = b_{i-1}\)。因为 \(i\) 产生的逆序对数量与 \(i-1\) 相同,所以同时删去 \((i-1,i)\) 后逆序对奇偶性不变。\(f_{i}\gets f_{i-2}\times A_{i-1}\)。

初始化 \(f_{0}=-1\)。

而逆序对为奇数的方案数加上逆序对为偶数的方案数为 \(\prod\limits_{i=1}^{n}A_i\),所以答案为 \(\frac{\prod\limits_{i=1}^{n}A_i + f_n}{2}\)。

时间复杂度 \(O(n)\)。

P7481 梦现时刻

\[F(a,b)=\sum\limits_{i}^{}\binom{b}{i}\binom{n-i}{a}\\ =\sum\limits_{i}^{}(\binom{b-1}{i}+\binom{b-1}{i-1})\binom{n-i}{a}\\ =(\sum\limits_{i}^{}\binom{b-1}{i}\binom{n-i}{a})+(\sum\limits_{i}^{}\binom{b-1}{i}\binom{n-i-1}{a})\\ = \]

P17629 永远的朋友

做了两个题属于是。

\(T = 1\)

不妨设选择异或的下标构成集合为 \(S\),其余下标构成集合为 \(T\)。

对每个二进制位分类讨论:

  1. \(s_i = 0\)。当 \([l,r]\) 中所有数二进制第 \(i\) 位均为 \(1\) 时贡献 \(2^i\);否则贡献 \(0\)。
  2. \(s_i = 1\)。当 \(S\) 中对应数二进制第 \(i\) 位均为 \(0\) 且 \(T\) 中对应数二进制第 \(i\) 位均为 \(1\) 时贡献 \(2^i\);否则贡献 \(0\)。

据此,一个简单的贪心是将区间 \([l,r]\) 中满足在 \(\text{highbit}(s)\) 这一位是 \(0\) 的数划分进 \(S\),其余划分进 \(T\)。因为将 \(S\) 中任意一个下标加入 \(T\) 或将 \(T\) 中任意一个下标加入 \(S\) 都会失去 \(2^{\text{highbit}(s)}\) 的贡献。

从高到低枚举每一位,对每个询问维护 \(S,T\) 即可。判断当前是否 \(S\) 中对应数二进制第 \(i\) 位均为 \(0\) 就是一个判定集合相等的问题,哈希即可。

时间复杂度 \(O(n\log V)\),空间复杂度 \(O(n)\)。

\(T=2\)

还是这么讨论:

  1. \(s_i = 0\)。当 \([l,r]\) 中所有数二进制第 \(i\) 位均为 \(0\) 时贡献 \(0\);否则贡献 \(2^{i}\)。
  2. \(s_i = 1\)。当 \(S\) 中对应数二进制第 \(i\) 位均为 \(1\) 且 \(T\) 中对应数二进制第 \(i\) 位均为 \(0\) 时贡献 \(0\);否则贡献 \(2^i\)。

不难发现,跟 \(s\) 有关且可能对贡献产生影响的 \((S,T)\) 只有 \(O(\log V)\) 对,因为每个二进制位只会有一对 \((S,T)\) 满足 \(s_i=1\) 且贡献 \(0\) 的情况。

而 \(S\) 有 \(2^{r-l+1}\) 个,所以当 \(2^{r-l+1}>\log V\) 时一定存在至少一个集合 \(S\) 满足所有 \(s_i=1\) 的二进制为均贡献 \(2^i\)。此时答案等于 \(a_l \text{ or } a_{l+1}\text{ or }a_{l+2}\text{ or }\dots \text{ or } a_r \text{ or } s\)。

否则 \(2^{r-l+1}\le \log V\)。枚举所有 \(S\) 取最大值即可。

时间复杂度 \(O(n\log V\log\log V)\),空间复杂度 \(O(n)\)。

P7481 梦现时刻

考虑求解 \(F(a,b)\) 的递推式。

\[\begin{aligned} F(a,b) &= \sum\limits_{i=0}^{b}\binom{b}{i}\binom{n-i}{a}\\ &= \sum\limits_{i=0}^{b}(\binom{b-1}{i}+\binom{b-1}{i-1})\binom{n-i}{a}\\ &=\sum\limits_{i=0}^{b-1}\binom{b-1}{i}\binom{n-i}{a}+\sum\limits_{i=0}^{b}\binom{b-1}{i-1}\binom{n-i}{a}\\ &=F(b-1,a)+\sum\limits_{i=0}^{b-1}\binom{b-1}{i}\binom{n-i-1}{a} \end{aligned} \]

记 \(G(a,b) = \sum\limits_{i=0}^{b}\binom{b}{i}\binom{n-i-1}{a}\)。那么 \(F(a,b) = F(a,b-1)+G(a,b-1)\)。

而:

\[\begin{aligned} F(a,b)&=\sum\limits_{i=0}^{b}\binom{b}{i}(\binom{n-i-1}{a}+\binom{n-i-1}{a-1})\\ &=G(a,b)+G(a-1,b)\\ \end{aligned}\\ \]

有:

\[\begin{aligned} F(a,b) &= F(a,b-1)+G(a,b-1)\\ &= G(a,b)+G(a-1,b)\\\\ G(a,b) &=F(a,b)-G(a-1,b)\\\\ F(a,b-1) &= G(a,b-1)+G(a-1,b-1)\\\\ F(a-1,b)&= F(a-1,b-1)+G(a-1,b-1) \end{aligned} \]

那么:

\[\begin{aligned} F(a,b)&=F(a,b-1)+G(a,b-1)\\ &=F(a,b-1)+(F(a,b-1)-G(a-1,b-1))\\ &=2F(a,b-1)-(F(a-1,b)-F(a-1,b-1))\\ &=2F(a,b-1)-F(a-1,b)+F(a-1,b-1) \end{aligned} \]

时间复杂度 \(O(m^2)\)。

2026.10.7

归档日志

因为在意每个编号第二次出现的位置,所以可以考虑到着做。这样第一次加入到时候就可以知道第二次的出现位置了。

定义状态函数 \(f_{i,j,s}\) 为确定完 \([i,2n]\) 是哪些样本,且有 \(j\) 个样本出现过 \(2\) 次,当前时常和为 \(s\) 的方案数。

对于状态 \((i+1,j,s)\),可知:

  1. 有 \((2n - i)-2j\) 个样本出现了 \(1\) 次,它们都可以放在位置 \(i\)。
  2. 有 \(cnt_i -((2n - i)-j)\) 个没出现过的样本可以放在位置 \(i\)。其中 \(cnt_i = \sum\limits_{x=1}^{n}[d_x \ge i]\)。

那么分情况讨论:

  1. 位置 \(i\) 放一个出现过 \(1\) 次的样本。枚举 \(i\) 和 \(i+1\) 的间隔时间为 \(t\)。那么有 \((2n-i)-2j\) 个样本的时间间隔会增加 \(t\)。转移为 \(f_{i,j+1,s+t\times ((2n-i)-2j)}\gets f_{i+1,j,s}\times ((2n-i)-2j)[L_i \le t \le R_i]\)。
  2. 位置 \(i\) 放一个没出现过的样本。枚举 \(i\) 和 \(i+1\) 的时间间隔为 \(t\)。那么有 \((2n-i)-2j\) 个样本的时间间隔会增加 \(t\)。转移为 \(f_{i,j,s+t\times ((2n-i)-2j)}\gets f_{i+1,j,s}\times (cnt_i -((2n - i)-j))[L_i \le t \le R_i]\)。

初始化 \(f_{2n,0,0}=cnt_{2n}\)。答案为 \(\sum\limits_{x=0}^{B}f_{1,n,x}\)。

转移用前缀和优化做到 \(O(n^2B)\)。

联络站

那么一种选法合法,当且仅当取交集后两棵树上均存在一个连通块。

不难想到点边容斥。记 \(T_1\) 中的路径交集为 \((V_1,E_1)\),\(T_2\) 中的为 \((V_2,E_2)\)。那么这种方案合法,当且仅当 \((V_1-E_1)(V_2-E_2)=1\)。

那么问题变成对所有方案的 \((V_1-E_1)(V_2-E_2)\) 求和。

拆成 \(V_1 V_2 - V_1E_2-E_1V_2+E_1E_2\)。它们本质是相同的,以 \(V_1V_2\) 举例。

枚举部门 \(c\)。对每对点 \((x,y)\) 维护有多少个 \((c_i,a_i,b_i,u_i,v_i)\) 满足 \(c_i = c,x\in P_{T_1}(a_i,b_i),y\in P_{T_2}(u_i,v_i)\)。记这个数量为 \(cnt(x,y)\)。那么再跑个背包,维护 \(f(i,x,y,z)\) 为前 \(i\) 个部门,选择的点对为 \((x,y)\),且选择了 \(z\) 个部门的贡献乘积和。其中一个部门的贡献就是 \(cnt(x,y)\)。

这样时间背包的复杂度是 \(O(N_1N_2CK)\)。维护 \(cnt(x,y)\) 可以直接二维差分。

整体时间复杂度 \(O(N_1N_2CK+M(\log N_1 + \log N_2) + N_1\log N_1 + N_2\log N_2)\)。

2026.10.8

QOJ779 命运歧途

容斥。

记 \(F(k,x)\) 为钦定有 \(x\) 对 \((i,i+1)\) 满足 \(|p_i - p_{i+1}|=k\) 的方案数。那么 \(ans_k = \sum\limits_{x\ge 0}^{}(-1)^{x-0}\binom{x}{0}F(k,x)\)。

因为是排列,所以一个满足 \(|p_i-p_{i+1}|=k\) 的连续段只会是形如 \(a,a+k,a+2k,\dots\) 或 \(a,a-k,a-2k,\dots\)。

那么钦定顺序为 \(a,a+k,a+2k,\dots\)。最后乘上 \(2^{cnt}\) 即可,其中 \(cnt\) 为连续段数量。

将 \(1\sim n\) 分成若干组,每组对 \(k\) 取模同余。

定义状态函数 \(f_{i,j}\) 为考虑完对 \(k\) 取模不超过 \(i\) 的所有元素,形成了 \(j\) 个连续段且乘上容斥系数的方案数。初始化 \(f_{-1,0}=1\)。

再定义一个辅助数组 \(g_{i,j,0/1}\) 为对当前这一组考虑完前 \(i\) 个元素,和之前的元素一共形成了 \(j\) 个连续段,且最后一个元素是否与倒数第二个元素相邻的方案数。

记这一组有 \(m\) 个数,且对 \(k\) 取模为 \(R\)。那么初始 \(g_{0,j,0}=f_{R-1,j}\)。

对于第 \(i\) 个元素,有:

  1. 钦定与第 \(i-1\) 个元素相邻。首先需要满足 \(i>1\)。
    1. 第 \(i-1\) 个元素与第 \(i-2\) 个元素相邻。\(g_{i,j,1}\gets -g_{i-1,j,1}\)。
    2. 第 \(i-1\) 个元素与第 \(i-2\) 个元素不相邻。\(g_{i,j,1}\gets -g_{i-1,j,0}\times 2\)。
  2. 不钦定与第 \(i-1\) 个元素相邻。\(g_{i,j+1,0}\gets g_{i-1,j,0/1}\times (j+1)\)。

最后 \(f_{R,j}=g_{m,j,0}+g_{m,j,1}\)。

对于 \(k\) 的答案 \(ans_k\) 即为 \(\sum\limits_{j}^{}f_{k-1,j}\)。

直接做时间复杂度 \(O(n^3)\)。

发现对于一个 \(k\),本质不同的 \(m\) 只有最多两个。令 \(F_m(x)\) 为对于一个有 \(m\) 个数的组,分成若干个连续段的生成函数。那么 \(ans_k = \sum\limits_{x}^{}\sum\limits_{a+b=x}^{}F_{m_1}(x)^aF_{m_2}(x)^b\)。

通过一些手法可以做到 \(O(n^2\sqrt{n})\)。

CF2004G Substring Compression

先考虑对 \(s[1:k]\) 求答案。

设 \(t_{2k} = x,t_{2k-1}=y\),那么贡献为 \(|x|\times y\)。如果将 \(t_{2k}\) 左端点左移 \(1\),\(t_{2k-1}\) 右端点左移 \(1\)。那么 \(|x'|=|x|+1,y'<\frac{y}{2}\)。有 \(|x'|\times y' < |x|\times \frac{y}{2}+\frac{y}{2}\)。而 \(|x|\times y - (|x|\times \frac{y}{2}+\frac{y}{2})=(|x|-1)\times \frac{y}{2}\ge 0\)。所以 \(|x'|\times y' < |x|\times y\)。

也就是说,最优解一定满足 \(|t_{2k-1}|=1\)。

定义状态函数 \(f_{i,j}\) 为考虑到 \(i\),\(t_{2k-1}=j\) 的最小代价(\(j=0\) 则表示 \(t_{2k-1}=s_{i-1}\))。有:

\[f_{i,j}\gets f_{i-1,j} + j[j\ge 1]\\ f_{i,s_{i-1}}\gets f_{i-1,0}+s_{i-1}\\ f_{i,0}\gets f_{i-1,j}[j\ge 1] \]

初始化 \(f_{1,0}=0\)。答案为 \(\min\limits_{j\ge 1}^{}f_{k,j}\)。

再考虑对 \(s[i:i+k-1]\) 求答案。不难想到把转移写成 \((\min,+)\) 矩阵的形式。

因为查询区间的长度一定,所以每 \(k\) 个元素分一个块后,查询的区间一定是一个块的后缀拼上下一个块的前缀。

维护前缀后缀积即可。时间复杂度 \(O(n\omega^3),\omega = 10\)。

P12493 [集训队互测 2024] 子集和

先差分,把问题变成 \(\sum\limits_{i=1}^{a}\sum\limits_{j=b}^{n}f(S\setminus \{i,j\})\)。有 \(a<b\)。

那么两边就独立了,相当于 \([1,a]\) 除去一个数的背包与 \([b,n]\) 除去一个数的背包合并再与 \([a+1,b-1]\) 的背包合并。

直接做时间复杂度 \(O(nm+qm^2)\),难以通过。

期望在询问时只有最多两个背包合并。

把询问 \((a,b)\) 挂在一个满足 \(l \le a \le mid < b \le r\) 的分治区间 \((l, mid, r)\) 上。问题变成 \([1,mid]\) 中除去一个在 \([1,a]\) 的数的背包与 \([mid+1,n]\) 中除去一个在 \([b,n]\) 的数的背包合并。这样询问就是 \(O(m)\) 的了。

两边问题是对称的,以左边的举例。

如果除去的数在 \([1,l-1]\)。预处理前缀除去一个数的背包,那么直接在这个背包的基础上加入 \([l,mid]\) 中的数即可。复杂度 \(O(mL)\),其中 \(L\) 为分治区间大小。

如果除去的数在 \([l, a]\)。预处理前缀的背包,在这个背包的基础上维护对于每个 \(x\in [l,mid]\),除去 \(x\) 的背包。那么再做一个前缀和就可以得到除去的数在 \([l,a]\) 的背包了。用缺一分治做到 \(O(mL\log L)\)。

那么有复杂度 \(T(n) = 2T(\frac{n}{2}) + mn\log n\)。则 \(T(n) = O(mn\log^2 n)\)。

整体时间复杂度 \(O(mn\log^2 n + qm+q\log n)\),空间复杂度 \(O(mn)\)。

CF301E Yaroslav and Arrangements

考虑通过构造良好序列的方式来对良好序列计数。

令最小值为 \(1\)(整体减去 \(\min -1\) 即可),从值 \(1\) 开始加入值。先被环成链,令 \(a_{n+1}=a_1=1\)。设当前加入的值为 \(i\),有 \(x\) 个;\(i-1\) 相邻的对有 \(y\) 个。那么这 \(y\) 个位置中间必须插入 \(i\),且 \(i\) 只能插在这些位置中间。那么剩下 \(x-y\) 个 \(i\) 任意分入 \(y\) 个空中,且最后 \(i\) 相邻的有 \(x-y\) 个。方案数为 \(\binom{(x-y)+(y-1)}{y-1}\)。最后一个序列总方案就是它们乘起来。

定义状态函数 \(f_{i,j,c,s}\) 为考虑完值 \([1,i]\)(减去 \(\min-1\) 后),共有 \(j\) 个数,其中 \(i\) 有 \(c\) 个相邻,且方案数为 \(s\) 的方案数。有:\(f_{i,j+c',c'-c,s\times \binom{c'-1}{c-1}}\gets f_{i,j,c,s}\)。

初始化 \(f_{1,i,i-1,1}=1[i\ge 2]\)。答案为 \(\sum\limits_{i\le m}^{}\sum\limits_{j\le n+1}^{}\sum\limits_{s\le k}^{}(m-i+1)f_{i,j,0,s}\)。

时间复杂度 \(O(n^5)\)。

P5289 [十二省联考 2019] 皮配

记总人数为 \(N\)。

如果 \(k=0\)。

任意一对 \((阵营,派系)\) 对应了唯一一个导师。那么阵营和派系就独立了,只需要将最后方案数乘起来即可。

对于阵营。记 \(t_i\) 为第 \(i\) 个城市的人数。定义状态函数 \(f_1(i,j)\) 为前 \(i\) 个城市,有 \(j\) 个人选择蓝阵营的方案数。转移是简单背包。最后方案数为 \(\sum\limits_{N-C_1 \le j \le C_0}^{}f_1(c,j)\)。

对于派系。定义状态函数 \(f_2(i,j)\) 为前 \(i\) 个学校,有 \(j\) 个人选择鸭派系的方案数。转移也是简单背包。最后方案数为 \(\sum\limits_{N-D_1\le j\le D_0}^{}f_2(n,j)\)。

如果 \(k\ne 0\)。

对没有限制的城市还是维护 \(f_1,f_2\)。

定义状态函数 \(f_3(i,x,y)\) 为考虑完前 \(i\) 个有限制的城市,蓝阵营有 \(x\) 个人,鸭派系有 \(y\) 个人的方案数。对每个城市再维护辅助数组 \(g(i,x,y,0/1)\) 表示考虑完这个城市的前 \(i\) 个学校,算上前面的城市蓝阵营有 \(x\) 个人,鸭派系有 \(y\) 个人,且这个城市选择蓝阵营或红阵营的方案数。

对城市 \(i\) 初始化 \(g(0,x,y,0)=g(0,x,y,1)=f_3(i-1,x,y)\)。

对于第 \(i\) 个学校分情况讨论:

  1. 没有不喜欢的导师。

    \[g(i,x+s_i,y+s_i,0)\gets g(i-1,x,y,0)\\ g(i,x+s_i,y,0)\gets g(i-1,x,y,0)\\ g(i,x,y+s_i,1)\gets g(i-1,x,y,1)\\ g(i,x,y,1)\gets g(i-1,x,y,1) \]

  2. 不喜欢 Yazid。

    \[g(i,x+s_i,y,0)\gets g(i-1,x,y,0)\\ g(i,x,y+s_i,1)\gets g(i-1,x,y,1)\\ g(i,x,y,1)\gets g(i-1,x,y,1) \]

  3. 不喜欢小 R。

    \[g(i,x+s_i,y+s_i,0)\gets g(i-1,x,y,0)\\ g(i,x,y+s_i,1)\gets g(i-1,x,y,1)\\ g(i,x,y,1)\gets g(i-1,x,y,1) \]

  4. 不喜欢 Zayid。

    \[g(i,x+s_i,y+s_i,0)\gets g(i-1,x,y,0)\\ g(i,x+s_i,y,0)\gets g(i-1,x,y,0)\\ g(i,x,y,1)\gets g(i-1,x,y,1) \]

  5. 不喜欢大 R。

    \[g(i,x+s_i,y+s_i,0)\gets g(i-1,x,y,0)\\ g(i,x+s_i,y,0)\gets g(i-1,x,y,0)\\ g(i,x,y+s_i,1)\gets g(i-1,x,y,1) \]

最后 \(f_3(i,x,y)=g(w,x,y,0)+g(w,x,y,1)\)。其中 \(w\) 为该城市包含学校数量。

最后考虑将它们合并起来。枚举无限制的城市中,蓝阵营有 \(x\) 个人,鸭派系有 \(y\) 个人;有限制的城市中,蓝阵营有 \(a\) 个人,鸭派系有 \(b\) 个人。方案数为 \(f_1(w_1,x)f_2(w_1,y)f_3(w_2,a,b)\),其中 \(w_1\) 为无限制城市数量,\(w_2\) 为有限制城市数量。条件为 \(N-C_1 \le x+a \le C_0,N-D_1\le y+b \le D_0\)。

只枚举 \(a,b\) 时,\(x\) 和 \(y\) 都有一个区间范围,可以直接前缀和查询。

那么整体时间复杂度 \(O(T(nm+m^2+(k+n)m^2))\)。

考虑优化。注意到一个有限制的城市中,没有不喜欢的导师的学校只有阵营受限制,派系是不受限制的。那么派系完全可以放在 \(f_2\) 里面算。这样 \(f_3(i,x,y)\) 中 \(y\) 这一维大小就不超过 \(ks\) 了。对于一个城市中没有限制的学校,记其人数和为 \(S\)。那么就只需要将初始化变成:\(g(0,x+S,y,0)=f_3(i-1,x,y),g(0,x,y,1)=f_3(i-1,x,y)\) 即可。

整体时间复杂度 \(O(T(nm+ksm + k^2sm))\)。

QOJ17713 剑玉挑战

容斥。变成求不存在至少一段连续 \(K\) 名选手成功的概率。

定义状态函数 \(f_{i}\) 为 \(i\) 不成功且满足条件的概率。

转移为:\(f_i =(1-\frac{A_i}{B_i})\sum\limits_{j = i-k}^{i-1}f_j \times \prod\limits_{x=j+1}^{i-1}\frac{A_x}{B_x}\)。

对 \(\frac{A_i}{B_i}\) 求前缀积。\(f_i = (1-\frac{A_i}{B_i})P_{i-1} \sum\limits_{j=i-k}^{i-1}\frac{f_j}{P_j}\)。

滑动窗口做到 \(O(n\log V)\)。

P15265 [USACO26JAN2] Dynamic Instability P

移动过程可以看作:

  1. 从 \(x\) 开始一直往下走,然后往上跳,再往下走……直到跳到 \(\text{lca}(x,y)\) 的祖先。
  2. 从这个 \(\text{lca}(x,y)\) 的祖先开始走。直到走到 \(y\)。

记 \(f(x)\) 为从 \(x\) 开始第一次走到 \(x\) 某个祖先(不包括 \(x\))的期望时间。

  1. 对于叶子。

    \(f(x) = 1\)。

  2. 对于非叶子。

    花 \(1\) 的代价走到某个儿子,再从儿子开始走。因为走到 \(x\) 和走到 \(x\) 祖先的概率相同,那么 \(f(x) = 1 + \frac{1}{|son_x|}\sum\limits_{y\in son_x}^{}f(y) + \frac{1}{dep_x}f(x)\)。

    解得 \(f(x) = \frac{dep_x}{dep_x-1}(1 + \frac{1}{|son_x|}\sum\limits_{y\in son_x}^{}f(y))\)。

这样从 \(x\) 开始走,直到跳到 \(\text{lca}(x,y)\) 的祖先期望时间就是 \(f(x)\) 了。

再考虑从 \(\text{lca}(x,y)\) 的祖先开始走到 \(y\) 的期望时间。记 \(g(x)\) 为从 \(fa_x\) 开始第一次走到 \(x\) 的期望时间。

记 \(G(x)\) 为从根走到 \(x\) 的期望时间,那么 \(x\) 到子树中一个点 \(y\) 的期望时间就是 \(G(y)-G(x)\)。显然 \(G(x) = g(x) + G(fa_x)\)。再维护 \(G'(x)\) 为 \(G(x)\) 的前缀和。

首先 \(g(1) = 0\)。

其次对于 \(g(x)\),有:\(g(x) =1+ \frac{1}{|son_{fa_x}|}(\sum\limits_{y\in son_{fa_x}\land y\ne x}^{}(f(y)+G(y) - \frac{1}{dep_{fa_x}}G'(y)))\)。

化简:

\[\begin{aligned} g(x) &=1+ \frac{1}{|son_{fa_x}|}(\sum\limits_{y\in son_{fa_x}\land y\ne x}^{}(f(y)+G(x) - \frac{1}{dep_{fa_x}}G'(fa_x)))\\ g(x)&= 1 + \frac{1}{|son_{fa_x}|}\sum\limits_{y\in son_{fa_x}\land y\ne x}^{}f(y) + \frac{|son_{fa_x}|-1}{|son_{fa_x}|}(G(fa_x)+g(x)) - \frac{|son_{fa_x}|-1}{|son_{fa_x}|\times dep_{fa_x}}G'(fa_x)\\ g(x)&=|son_{fa_x}| + \sum\limits_{y\in son_{fa_x}\land y\ne x}^{}f(y) + (|son_{fa_x}|-1)(G(fa_x) - \frac{1}{dep_{fa_x}}G'(fa_x)) \end{aligned} \]

最后对于询问:

  1. \(x\) 是 \(y\) 的祖先。答案为 \(G(y)- G(x)\)。
  2. \(x\) 不是 \(y\) 的祖先。记 \(z = \text{lca}(x,y)\)。从 \(z\) 某个祖先走到 \(y\) 期望时间为 \(G(y)-\frac{1}{dep_z}G'(z)\)。那么答案为 \(f(x) + F(fa_x) - F(z)+ G(y) - \frac{1}{dep_z}G'(z)\),其中 $F(x) $ 为 \(\frac{f(x)}{dep_x}\) 的前缀和。因为 \(x\) 走到某个 \(z\) 的祖先期望等于 \(f(x)+F(fa_x)-F(z)\)。推导可以假设链是 \(1,2,3,\dots, n\),要从 \(x\) 走到 \(1\)(\(z\) 祖先的期望和 \(z\) 相同)。这个是简单的。

时间复杂度 \(O(n\log n+n\log V)\)。

P9561 [SDCPC 2023] Colorful Segments

线段按 \(l\) 升序排序,相同按 \(r\) 升序。

定义状态函数 \(f_{R,0/1}\) 为考虑到当前线段,覆盖的最右边点为 \(R\),且是红色或蓝色线段。

如果线段 \((l,r,c)\) 要被选择:

  1. \(r \le R\)。\(f_{R,c}\gets f'_{R,c}\)。
  2. \(r>R\)。
    1. \(l \le R\)。\(f_{r,c}\gets f'_{R,c}\)。
    2. \(l>R\)。\(f_{r,c}\gets f'_{R,0/1}\)。

也就是:

  1. 对于 \(R <r\)。\(f_{R,c}= f'_{R,c}\)。
  2. 对于 \(R = r\)。\(f_{R,c}=f'_{R,c}+\sum\limits_{l\le R' \le r}^{}f'_{R',c} + \sum\limits_{R'<l}^{}(f'_{R',0}+f'_{R',1})\)。
  3. 对于 \(R > r\)。\(f_{R,c}=f'_{R,c}+f'_{R,c}\)。

初始化 \(f_{0,0}=1\)。答案为 \(\sum f_{r,c}\)。

放线段树上。需要维护:

  1. 单点加。
  2. 区间乘。
  3. 区间求和。

时间复杂度 \(O(n\log n)\)。

Nowcoder127481J 小Z擦黑板

一个区间 \([l,r]\) 是完美的,当且仅当 \(\{a_i | l\le i \le r\}\) 可以表示成一个区间。

显然点减边容斥做这个。

定义状态函数 \(f_{i}\) 为最后一个区间右端点在 \(i\) 的方案数。从左往右枚举 \(r\),对每个 \(l\) 维护 \([l+1,r]\) 中点减去边的值,记为 \(w(l+1,r)\)。那么转移为:\(f_i=\sum\limits_{l=0}^{i-1}f_l[w(l+1,r)=1]\)。

首先 \(w(l,r)\gets w(l,r-1)\)。再考虑 \(r\) 带来的贡献:

  1. 点。记 \(pre_i\) 为 \(i\) 左边第一个与 \(a_i\) 值相同的下标。则对 \(l\in (pre_i,i]\),\(w(l,r)\gets 1\)。
  2. 边。
    1. \((a_r-1,a_r)\)。记 \(i\) 左边第一个值为 \(a_r-1\) 的下标为 \(pos\)。则对 \(l\in (pre_i,pos]\),\(w(l,r)\gets -1\)。
    2. \((a_r,a_r+1)\)。记 \(i\) 左边第一个值为 \(a_r+1\) 的下标为 \(pos\)。则对 \(l\in (pre_i,pos]\),\(w(l,r)\gets -1\)。

线段树维护区间加法,区间带权最小值和。

时间复杂度 \(O(n\log n)\)。

QOJ9140 火车调度站

把边放到点上,那么相当于选择的路径两两点不相交。

把每列火车拆成 \(k_i\) 个前缀,问题变成给定 \(\sum k_i\) 条路径,要选一些互不相交的路径,使得权值和最大。

定义状态函数 \(f_u\) 为之考虑 \(u\) 子树中的路径时的最大贡献。

首先如果 \(u\) 没被一条向下的链覆盖,\(f_u = \sum\limits_{v\in son_u}^{}f_v\)。

如果 \(u\) 被一条向下的链覆盖,记这条链为 \(u\to x\),价值为 \(val\)。不妨设路径为 \(u \to y_1 \to y_2\to \dots\to x\)。那么此时 \(y_1\) 的贡献就需要从 \(f_{y_1}\) 变成 \(\sum\limits_{v\in son_{y_1}}^{}f_{v}\)。而 \(f_{y_2}\) 被算到了,需要变成 \(\sum\limits_{v\in son_{y_2}}^{}f_v\)……直到 \(f_x\) 变成 \(\sum\limits_{v\in son_x}^{}f_v\)。

维护 \(g_{u} = -f_u + \sum\limits_{v\in son_u}^{}f_v\)。那么选择 \(u\to x\) 的链,带来的贡献就是 \(val + \sum\limits_{y\in P(u,x)\land y\ne u}^{}g_y\)。拍到 dfn 序上面,\(val + \sum\limits_{y\in P(u,x)\land y\ne u}^{}g_y\) 就是一个区间加,单点查询。

线段树维护做到 \(O(n\log n+\sum k_i \log n)\)。

2026.10.9

QOJ8240 卡牌游戏

维护 \(f(l,r)\) 为操作完区间 \([l,r]\) 后剩余卡牌数量。

因为操作是从左往右遍历,维护栈删除。所以可以想到对每个点考虑它什么时候被删。

\(l\) 是特殊的,因为 \(l\) 如果被删则一定只会被它后面第一个与 \(a_l\) 值相同的点删。

记 \(nxt_i\) 为 \(i\) 后面最小的 \(j\),使得 \(a_j = a_i\)。对 \(l\) 的情况分类讨论:

  1. \(nxt_{l}\le r\)。在遍历完 \([l,nxt_l-1]\) 中的元素后,无论栈长什么样都会被清空。此时等价于从 \(nxt_l+1\) 开始遍历到 \(r\)。则 \(f(l,r) = f(nxt_l+1,r)\)。
  2. \(nxt_l > r\)。此时 \(l\) 一定不会被删掉,且它一直在栈底。那么最后的栈等价于从 \(l+1\) 开始遍历到 \(r\) 的栈再在底部放一个 \(a_l\)。则 \(f(l,r)=f(l+1,r)+1\)。

那么从大到小扫 \(r\)。对每个 \(l\) 维护当前 \(f(l,r)\) 的值。

操作就相当于是一个区间继承历史版本,区间加法。因为查询是单点查询,所以可以直接标记永久化。

时间复杂度 \(O(n\log n)\)。

Newcoder22616 小y的纸牌

定义状态函数 \(f_{i,j}\) 为考虑完前 \(i\) 张纸牌,其中一堆的前缀最大值等于 \(\max\limits_{x\le i}^{}A_x\),另一堆的前缀最大值等于 \(j\) 的最小代价。

记 \(m_i =\max\limits_{x\le i}^{}A_x\)。

分情况讨论:

  1. \(A_i \le m_{i-1}\)。此时前缀最大值不变。
    1. \(A_i\) 分到前缀最大值等于 \(m_{i-1}\) 的这堆。\(f_{i,j}\gets f_{i-1,j}+m_{i-1}\)。
    2. \(A_i\) 分到前缀最大值等于 \(j\) 的这堆。
      1. \(A_i \le j\)。\(f_{i,j}\gets f_{i-1,j}+j\)。
      2. \(A_i > j\)。\(f_{i,A_i}\gets f_{i-1,j}+A_i\)。
  2. \(A_i > m_{i-1}\)。此时前缀最大值改变。
    1. \(A_i\) 分到前缀最大值等于 \(m_{i-1}\) 的这堆。\(f_{i,j}\gets f_{i-1,j}+A_i\)。
    2. \(A_i\) 分到前缀最大值等于 \(j\) 的这堆。\(f_{i,m_{i-1}}\gets f_{i-1,j}+A_i\)。

初始化 \(f_{0,0}=0\)。答案为 \(\min\limits_{j} f_{n,j}\)。

简化一下,也就是:

  1. \(A_i \le m_{i-1}\)。
    1. 对 \(j\in [0,A_i-1]\)。\(f_{i,j}=f_{i-1,j}+m_{i-1}\)。
    2. 对 \(j=A_i\)。\(f_{i,j} = \min\limits_{k\le A_i}^{}f_{i-1,k}+A_i\)。
    3. 对 \(j\in [A_i+1,m_{i-1}]\)。\(f_{i,j}=f_{i-1,j}+j\)。
  2. \(A_i > m_{i-1}\)。
    1. 对 \(j\in [0,m_{i-1}-1]\)。\(f_{i,j}=f_{i-1,j}+A_i\)。
    2. 对 \(j = m_{i-1}\)。\(f_{i,j} = \min\limits_{k\le j}^{}f_{i-1,k}+A_i\)。

需要快速维护区间加定值、区间加下标、查询前缀最小值、单点修改。

尝试使用分块,记块长为 \(B\)。

对于块 \(x\) 中每个点 \(y\),可以被表示成 \(f_{y} = f'_y + y\times tag_1(x) +tag_2(x)\) 的形式。其中 \(tag_1(x)\) 为整块加下标操作,\(tag_2(x)\) 为整块加定值。

那么对每个点 \(i\),看成一条直线 \(y = i \times x + f'_i\)。这样查询前缀最小值于一个整块就可以直接在凸包上面扫了。

分析一下时间复杂度。对于建凸包的操作,单次代价为 \(O(B)\),只有初始化或散块修改时会重构,次数为 \(O(n)\),则复杂度 \(O(nB)\)。对于区间修改操作,复杂度 \(O(n(B+\frac{n}{B}))\)。对于查询前缀最小值,因为一个块重构前 \(tag_1(x)\) 是单调递增的,所以一个块在每次重构前最多消耗 \(O(B)\) 的代价,重构次数为 \(O(n)\),则复杂度 \(O(nB + \frac{n^2}{B})\)。

取 \(B = \sqrt{n}\),复杂度为 \(O(n\sqrt{n})\)。

QOJ17411 Restricted Removals

记相邻两个 \(B_i = 0\) 的位置为 \(x,y\)。那么在 \(x\) 出取出的值下标应该是区间 \([x,y-1]\) 的一个前缀。

从右往左确定 \(B\) 数组。定义状态函数 \(f_{i,j}\) 为 \([i,n]\) 中有 \(j\) 个 \(1\) 且 \(B_i = 0\) 的最小得分。

维护 \(A_i\) 的前缀和为 \(s_i\)。转移为 \(f_{i,k}\gets \max\limits_{x=i-1}^{i'-1}s_x - s_{i-1} +f_{i',k-(i'-i-1)}\)。

枚举区间最大值是 \(s_{u}\)。记 \(L_u\) 为左边第一个大于 \(s_u\) 的位置加 \(1\),\(R_u\) 为右边第一个大于 \(s_u\) 的位置减 \(1\)。那么对 \(i\in [L_u+1,u+1],i'\in [u+1,R_u+1]\),都会有转移:\(f_{i,k}=\min(f_{i,k},-s_{i-1} + s_u + f_{i',k-(i'-i-1)})\)。

如果对 \(u\) 维护出 \(g_{u,k} = \min\limits_{i=u+1}^{R_u}f_{i,k-(i-u)}\)。那么 \(f_{i,k} = -s_{i-1}+(\min\limits_{i\in [L_u+1,u+1]}^{}g_{u,k-(u-i-1)}+s_u)\)。

维护 \(g_{u,k}\) 相当于是区间最小值,树状数组即可。后者对 \(L_u+1\) 分组,每组用单调队列做到线性。

整体复杂度 \(O(n^2\log n)\)。其实 \(g\) 也可以做到线性。

Maximum Score of a Playlist

定义状态函数 \(f_{i}\) 为考虑完前 \(i\) 首歌,最后一首选择的是 \(i\) 最大总分。

转移为 \(f_i = A_i + \max\limits_{j=0}^{i-1}f_j + B_{j}\times B_i\)。

把 \((f_j,B_j)\) 看成直线 \(y = B_j \times x + f_j\),就是一个查询 \(x= x_0\) 时最大纵坐标的问题。李超线段树做到 \(O(n\log n)\)。

2026.10.11

CF2271E Array Emptying

最优操作应该是先分裂再删除。

因为如果一个最优操作中,某个分裂在另一个删除后面,交换它们:

  1. 这个删除往后移了,实际操作时比较的 \(k\) 增大,也一定可以删除。
  2. 这个分裂往前移了,因为 \(k\) 更大时都需要分裂,所以实际操作时也需要分裂。

设分裂操作次数为 \(m\),那么总代价为 \(m + (n+m) = n+2m\)(因为分裂一次多一个数)。

考虑对 \(m\) 二分答案,问题变成判定 \(m\) 次分裂后再删除,是否可以把所有数都删完。

如果知道分裂完后得到的数为 \(b_{1\sim n+m}\),删除显然是从小到大删。那么对于第 \(i\) 大的数 \(v_i\),它的限制就是 \(k+m+i-1 \ge v_i\)。

从后往前确定 \(v\),把分裂的数填到 \(v\) 中。不妨设当前正在确定 \(v_i\) 的值,还没有填的数中最大的那个为 \(x\)。那么 \(x\) 要么填给 \(v_i\),要么把 \(x\) 分裂。因为如果 \(x\) 不填也不分裂,最后 \(v_i\) 的值不会超过 \(x\),且 \(x\) 会填在 \(i\) 前面,不满足 \(v\) 单调不减的性质。

分类讨论:

  1. \(k + m +i - 1 \ge x\)。直接填了不劣。因为分裂后新的 \(x'\) 不会大于 \(x\),它也一定能填,但 \(x\) 的分裂导致剩下数的数量增多了。
  2. \(k+m+i-1< x\)。只能分裂。

时间复杂度 \(O(n\log n)\)。

CF2271F Beautiful Pillers

答案不超过 \(2\)。且答案为 \(2\) 的一种构造为 \(a_1 = +\infin, a_n = +\infin\)。

那么只需要考虑答案是否能是 \(0\) 或 \(1\)。记 \(f(l,r)\) 为区间 \([l,r]\) 是否是美观的。

答案为 \(0\) 当且仅当 \(f(1,n) = 1\)。

对于 \(f(l,r)\),一个简单的求法是每次找到 \([l,r]\) 中最大值第一次和最后一次出现的位置 \(L,R\)。则 \(f(l,r) = f(l,L - 1)\land f(R+1,r)\land [L<R]\)。

对于答案可能为 \(1\) 的情况,分类讨论:

  1. \(a_1\) 或 \(a_n\) 是全局最大值。此时将另一个也改成全局最大值即可。
  2. \(a_1\) 和 \(a_n\) 都不是全局最大值。记 \(L,R\) 为全局最大值第一次和最后一次出现的位置。再分情况讨论:
    1. \(L < R\)。此时 \((L,R)\) 是好的,只需要让 \(f(1,L-1)=1,f(R+1,n)=1\)。
      1. 初始时 \(f(1,L-1)=0\) 且 \(f(R+1,n)=0\)。显然不可能只修改一个位置的值,答案一定不为 \(1\)。
      2. 初始时 \(f(1,L-1)=1\) 或 \(f(R+1,n)=1\)。将 \(a_1\) 或 \(a_n\) 改成全局最大值即可。
    2. \(L=R\)。此时如果想让 \(f(1,n)=1\) 且答案为 \(1\),就必须改 \(a_{1},a_n,a_L\) 中的一个。且改 \(a_1\) 或 \(a_n\) 时只能改成 \(a_L\);改 \(a_L\) 时尽可能不让它成为最大值,即改成 \(1\)。分别判断即可。

时间复杂度 \(O(n)\) 或 \(O(n\log n)\)。

2026.10.12

P9745 「KDOI-06-S」树上异或

拆位。

定义状态函数 \(f_{i,x,y}\) 为 \(i\) 所属连通块选择二进制下第 \(x\) 位,且当前异或和为 \(y\) 的价值乘积和。

初始化 \(f_{u,j,(x_u)_j} = 1\)。合并一个儿子 \(v\):

  1. \((u,v)\) 断开。\(f_{u,j,y}\gets f'_{u,j,y}\times f_{v,a,b}\times b\times 2^a\)。
  2. \((u,v)\) 不断开。\(f_{u,j,y\oplus y'}\gets f'_{u,j,y}\times f_{v,j,y'}\)。

最后答案为 \(\sum f_{root,j,x}\times x\times 2^j\)。

时间复杂度 \(O(n\log V)\)。

QOJ8180 Bridge Elimination

定义状态函数 \(f(n,m)\) 为 \(n\) 个点的联通无向图,有 \(m\) 个桥的方案数;\(g(m)\) 为将 \(n\) 个数分成 \(m\) 组,每组选一个 \(a_x\) 的乘积之和。

那么答案为 \(\sum\limits_{i=0}^{n-1}f(n,i)g(i+1)\)。

对于 \(g(m)\)。跑一个背包即可。这部分时间复杂度 \(O(n^3)\)。

记 \(H(n)\) 为 \(n\) 个点的联通无向图方案数。那么 \(H(n) = 2^{\frac{n(n-1)}{2}}-\sum\limits_{i=1}^{n-1}\binom{n-1}{i-1}H(i)2^{\frac{(n-i)(n-i-1)}{2}}\)。时间复杂度 \(O(n^2)\)。

记 \(K(n)\) 为 \(n\) 个点的点双数量。根据 Prüfer 序列,将大小为 \(c_{1\sim k}\) 的连通块连起来的方案数为 \((\sum c_i)^{k-2}\prod c_i\)。维护辅助数组 \(k_{i,j}\) 为将 \(i\) 个点分成 \(j\) 部分的方案数。有:

\[k_{i,j}=\sum\limits_{x=1}^{i}\binom{i-1}{x-1}k_{i-x,j-1}xK(x)\\ K(i)=H(i) - \sum\limits_{x=2}^{i}k_{i,x}i^{x-2} \]

对于 \(f(n,m)\)。维护辅助数组 \(dp2_{i,j}\) 为将 \(i\) 个点分成 \(j\) 部分的方案数。有:

\[dp2_{i,j}=\sum\limits_{x=1}^{i}\binom{i-1}{x-1}dp2_{i-x,j-1}xK(x)\\ f(i,j) = dp2_{i,j+1}i^{j+1-2} \]

这部分时间复杂度 \(O(n^3)\)。整体时间复杂度 \(O(n^3)\)。

QOJ8184 不同加数计数

枚举产生贡献的数 \(x\)。

答案为 \(\sum\limits_{x=1}^{n}\sum\limits_{i=1}^{m}(-1)^{i-1}\binom{m}{i}\binom{n-ix-1}{m-i-1}+[m\mid n](-1)^{m-1}\)。这里 \([m\mid n](-1)^{m-1}\) 是因为 \(\binom{-1}{-1}\) 应该是 \(1\)。

\[\begin{aligned}\\ &\sum\limits_{x=1}^{n}\sum\limits_{i=1}^{m}(-1)^{i-1}\binom{m}{i}\binom{n-ix-1}{m-i-1}\\ &=\sum\limits_{i=1}^{m}(-1)^{i-1}\binom{m}{i}\sum\limits_{x=1}^{n}\binom{n-ix-1}{m-i-1}\\ &=\sum\limits_{i=1}^{m}(-1)^{i-1}\binom{m}{i}F(m-i-1) \end{aligned} \]

这里 \(F(x) = \sum\limits_{k=1}^{\lfloor\frac{n-m+i}{i}\rfloor}\binom{n-ik-1}{x}\)。令 \(t = \lfloor\frac{n-m+i}{i}\rfloor\)。

有:

\[\begin{aligned}\\ F(x)&= \sum\limits_{k=1}^{t}\binom{n-ik-1}{x}\\ &=\sum\limits_{k=1}^{t}\sum\limits_{y= 0}^{i}\binom{i}{y}\binom{n-(k+1)i-1}{x-y}\\ &=\sum\limits_{y=0}^{i}\binom{i}{y}\sum\limits_{k=1}^{t}\binom{n-(k+1)i-1}{x-y}\\ &=\sum\limits_{y=0}^{i}\binom{i}{y}\sum\limits_{k=2}^{t+1}\binom{n-ki-1}{x-y}\\ &=\sum\limits_{y=0}^{i}\binom{i}{y}(F(x-y)-\binom{n-i-1}{x-y}+\binom{n-(t+1)i-1}{x-y})\\ &=\sum\limits_{y=1}^{i}\binom{i}{y}(F(x-y)-\binom{n-i-1}{x-y}+\binom{n-(t+1)i-1}{x-y}) + \binom{i}{0}(F(x)-\binom{n-i-1}{x}+\binom{n-(t+1)i-1}{x})\\\\ \end{aligned}\\ \]

那么:

\[\begin{aligned}\\ \binom{n-i-1}{x}-\binom{n-(t+1)i-1}{x}&=\sum\limits_{y=1}^{i}\binom{i}{y}(F(x-y)-\binom{n-i-1}{x-y}+\binom{n-(t+1)i-1}{x-y})\\ &=\sum\limits_{y=2}^{i}\binom{i}{y}(F(x-y)-\binom{n-i-1}{x-y}+\binom{n-(t+1)i-1}{x-y})+\binom{i}{1}(F(x-1)-\binom{n-i-1}{x-1}+\binom{n-(t+1)i-1}{x-1})\\ \\ F(x-1)&=\frac{1}{i}(-\sum\limits_{y=2}^{i}\binom{i}{y}(F(x-y)-\binom{n-i-1}{x-y}+\binom{n-(t+1)i-1}{x-y})+(\binom{n-i-1}{x}-\binom{n-(t+1)i-1}{x})+i(\binom{n-i-1}{x-1}-\binom{n-(t+1)i-1}{x-1}))\\ F(x)&=\frac{1}{i}(-\sum\limits_{y=2}^{i}\binom{i}{y}(F(x+1-y) -\binom{n-i-1}{x+1-y}+\binom{n-(t+1)i-1}{x+1-y}) +(\binom{n-i-1}{x+1}-\binom{n-(t+1)i-1}{x+1})+i(\binom{n-i-1}{x}-\binom{n-(t+1)i-1}{x})) \end{aligned} \]

由此 \(F(x)\) 就可以递推了,边界为 \(F(0) = \sum\limits_{k=1}^{t}\binom{n-ik-1}{0}=t\)。时间复杂度 \(O(m^2)\)。

整体时间复杂度 \(O(m^3)\)。

P11316 [RMI 2021] 去 M / NoM

把 \(1\sim 2n\) 分成 \(m\) 个对 \(m\) 取模同余的等价类。

要求就是不存在 \(i\),使得绿色 \(i\) 和灰色 \(i\) 在一个等价类中。

定义 \(G(x)\) 为钦定 \(x\) 个这样的 \(i\) 在一个等价类中的方案数。那么 \(ANS = \sum\limits_{x\ge 0}^{}(-1)^{x-0}\binom{x}{0}G(x)\)。

定义状态函数 \(f_x\) 为选择 \(x\) 对这样的 \(i\) 的方案数。记 \(c\) 为当前等价类元素数量。那么:\(f_{x+y}\gets f'_x\times \binom{c}{2y}\times \binom{2y}{y}\times y!\)。

最后 \(G(x) = f_x \times \binom{n}{x}\times x! \times (2n-2x)!\)。

时间复杂度 \(O(n^2)\)。

QOJ4279 鞍点

定义 \(G(x)\) 为钦定 \(x\) 个鞍点的方案数。

那么答案为 \(k^{nm} - \sum\limits_{x\ge 0}^{}(-1)^{x-0}\binom{x}{0}G(x)\)。

因为鞍点是不同行不同列的,所以这些鞍点可以看作是不断删除一行一列得到的。从小到大删除鞍点,记当前鞍点值为 \(v\),有:

  1. 所有剩余鞍点权值不小于 \(v\)。
  2. 当前鞍点所在行,列中的点除了它自己都小于 \(v\)。

那么它所在行,列中的其它点取值范围就是 \([1,v-1]\)。然后这一行一列就没用了,删除即可。

反过来从大到小加点。定义状态函数 \(f_v(n,m)\) 为加入所有被钦定且值在 \([v,k]\) 中的鞍点后,得到一个 \(n\times m\) 的矩阵带上容斥系数的方案数。

初始化 \(f_{k+1}(n,m)=k^{nm}\)。

枚举有 \(x\) 个鞍点的值为 \(v\)。有 \(f_{v}(n+x,m+x)\gets f_{v+1}(n,m)(v-1)^{\sum\limits_{i=1}^{x}(n+m+2i-2)}(-1)^{x}\binom{n+x}{x}x!\binom{m+x}{x}\)。

答案为 \(k^{nm}-f_{1}(n,m)\)。

注意到任意 \(f_i(x,y)\) 可能有实际贡献,必须满足 \(y-x=m-n\)。所以 \((x,y)\) 只有 \(O(n)\) 对。

时间复杂度 \(O(n^2k)\)。

P8329 [ZJOI2022] 树

定义 \(c(i,1/2)\) 为 \(i\) 在第 \(1/2\) 棵树中是否是叶子。

两棵树合法的条件为 \(\prod\limits_{i=1}^{n}[c(i,1)+c(i,2)-2c(i,1)c(i,2)=1]\)。

因为 \(c(i,1)+c(i,2)-2c(i,1)c(i,2)\in \{0,1\}\),所以问题等价于对所有树 \((T_1,T_2)\),求 \(\prod\limits_{i=1}^{n}(c(i,1)+c(i,2)-2c(i,1)c(i,2))\) 之和。

乘法展开,变成对每个点 \(i\),选择 \(c(i,1),c(i,2),-2c(i,1)c(i,2)\) 中的一个。

因为选择 \(0\) 是没用的,所以对于点 \(i\),相当于:

  1. 强制 \(c(i,1)=1\)。贡献 \(1\)。
  2. 强制 \(c(i,2)=1\)。贡献 \(1\)。
  3. 强制 \(c(i,1)=1,c(i,2)=1\)。贡献 \(-2\)。

树的生成相当于对每个点 \(i\) 选择 \(p_i,q_i\) 当作 \(T_1,T_2\) 中的父亲。

那么有:

  1. 强制 \(c(i,1)=1\)。等价于不存在 \(j > i,p_j = i\)。
  2. 强制 \(c(i,2)=1\)。等价于不存在 \(j < i,q_j = i\)。

按照 \(i\) 从小到大确定 \(p,q\)。

定义状态函数 \(f_{c,x,y}\) 为考虑完 \([1,c]\) 中的数,其中有 \(x\) 个 \(i\) 限制了不存在 \(j > i,p_j=i\),有 \(y\) 个 \(i\) 还没确定 \(q_i\) 的贡献和。

初始化 \(f_{0,0,0}=1\)。分情况转移:

  1. 强制 \(c(i,1)=1\)。

    对于 \(p_i\),若 \(i=1\) 则方案数为 \(1\);若 \(i> 1\) 则方案数为 \(i-1-x\)。记这个为 \(v_0\)。

    对于 \(q_i\),因为不清楚后面强制了哪些 \(c(i',2)=1\),所以放后面决策。

    对于 \(q_j = i\),枚举有 \(y'\) 个这样的 \(j\)。

    转移为 \(f_{c,x+1,y-y'+1}\gets 1\times f_{c-1,x,y}\times v_0\times \binom{y}{y'}\)。

  2. 强制 \(c(i,2)=1\)。

    对于 \(p_i\),方案数还是 \(v_0\)。

    对于 \(q_j=i\),因为 \(i\) 不能取,所以不存在这样的 \(j\)。

    转移为 \(f_{c,x,y+1}\gets 1\times f_{c-1,x,y}\times v_0\)。

  3. 强制 \(c(i,1)=1,c(i,2)=1\)。

    对于 \(p_i\),还是 \(v_0\)。

    对于 \(q_j=i\),还是不存在 \(j\)。

    转移为 \(f_{c,x+1,y+1}\gets -2\times f_{c-1,x,y}\times v_0\)。

最后答案为 \(\sum\limits_{x}^{}f_{n,x,1}\)。时间复杂度 \(O(n^4)\)。

复杂度太大的原因是我们把 \(q_i\) 延后决策了,导致一次可能有多个点被决策。

但是每个点的父亲只有一个,所以可以把第 \(3\) 维改成提前钦定。即 \(f_{c,x,y}\) 为考虑完 \([1,c]\) 中的数,其中有 \(x\) 个 \(i\) 没有限制不存在 \(j > i,p_j=i\),\([c+1,n]\) 中还有 \(y\) 个 \(i\) 限制了不存在 \(j<i,q_j=i\) 的贡献和。

转移为:

\[v_0 = (i-1-x) + [i=1\land x= 0],v_1 = y'+[i=n\land y'=0]\\ f_{c,x+1,y-1}\gets 1\times f_{c,x,y}\times v_0 \times v_1\\ f_{c,x,y}\gets 1\times f_{c,x,y}\times v_0\times v_1\\ f_{c,x+1,y}\gets -2\times f_{c,x,y}\times v_0\times v_1 \]

初始化 \(f_{0,0,y}=1\)。答案可以用 \(f_{n-1}\) 再转移一遍得到,是 \(\sum f'_{n,x,0}\)。

时间复杂度 \(O(n^3)\)。

2026.10.13

CountTables

\(\text{ANS}=\sum\limits_{x\le n}^{}\sum\limits_{y\le m}^{}(-1)^{n-x}(-1)^{m-y}C^{xy}{n \brack x} {m \brack y}\)。

时间复杂度 \(O(nm)\)。

P14230 不连续子串 / subseq

钦定一个子序列匹配策略,使得它和所有本质不同子序列双射。

对于已知子序列 \(p_{1\sim k}\),记 \(pos_i\) 为 \(p_i\) 在 \(a\) 中匹配的位置,那么 \(pos_{i+1}\) 选择 \([pos_i+1,n]\) 中第一个 \(a_j = p_{i+1}\) 的 \(j\) 即可。

记 \(pre_i\) 为 \(i\) 前面第一个满足 \(a_j = a_i\) 的 \(j\),没有则为 \(0\)。

对于原问题,每个 \(i\) 有 \(3\) 种状态:

  1. \(i\) 不是下标子序列中的元素。
  2. \(i\) 是下标子序列中的元素,且不是下标子序列的子序列中的元素。
  3. \(i\) 是下标子序列的子序列中的元素。

对相邻两个状态为 \(3\) 的点 \(l,r\),考虑所有 \([l+1,r-1]\) 中状态为 \(2\) 的点什么情况下合法。不妨设这些点为 \(x_{1\sim k}\)。则:

  1. \(pre_{x_1}\le l\)。
  2. 对 \(i\in [2,k]\),\(pre_{x_i}\le x_{i-1}\)。
  3. 不存在 \(i\in [1,k]\),使得 \(a_{r} = a_{x_i}\)。
  4. \(pre_{r}\le x_k\)。

定义状态函数 \(f_{i}\) 为考虑完 \([0,i]\) 中的数,且 \(i\) 是一个状态为 \(3\) 的点的方案数。

再维护辅助数组 \(g_{i,j}\) 为某个状态为 \(3\) 的点后面跟若干个状态为 \(2\) 的点,且最后一个状态为 \(2\) 的点为 \(i\),同时钦定这些状态为 \(2\) 的点 \(x\) 都满足 \(a_x\ne j\) 的合法方案数。即 \(g_{i,j}=\sum\limits_{x=0}^{i-1}f_{x}\times h(x +1,i,j)\)。其中 \(h(l,r,v)\) 表示在 \([l,r]\) 中选择一些状态为 \(2\) 的点,\(r\) 的状态为 \(2\),且不选择 \(a_x = v\) 的点,同时满足限制的方案数。

对于 \(g\),有:\(g_{i,j}=(\sum\limits_{pre_i \le k<i}^{}g_{k,j}+\sum\limits_{pre_i \le k<i}^{}f_k)[a_i\ne j]\)。

对于 \(f\),有:\(f_{i} = \sum\limits_{pre_i\le k<i}^{}f_k + \sum\limits_{pre_i \le k<i}^{}g_{k,a_i}\)。

初始化 \(f_0=1\)。令 \(a_{n+1}= n+1\) 且对于 \(f_{n+1}\) 不通过 \(f_0,g_0\) 转移,答案就是 \(f_{n+1}\)。

但是这样多算了子序列的子序列为空的情况,减去即可。

前缀和优化做到 \(O(n|\sum|)\),这里 \(O(|\sum|) = O(n)\)。

2026.10.15

QOJ6398 谜题:Tapa

注意到偶数行偶数列的格子是无用的。因为它一定会影响 \(4\) 个格子,如果一组合法解中某个偶数行偶数列的格子是白色,将它左右两个格子改成白色并将它改成黑色等价。

则现在一个有用的格子只会影响恰好两个格子。

记 \(s_i = 1\) 表示这个有数字的格子周围有一个白色格子。

对于一个有用的格子,分类讨论:

  1. 影响的两个格子均满足 \(s=1\)。此时它可以是白色的。
  2. 影响的两个格子存在 \(s=0\)。此时它一定是黑色的。

给所有可能是白色的格子影响到的两个格子之间连边,那么会得到一张二分图。

问题变成对这张二分图找完美匹配。

时间复杂度 \(O((nm)^2)\)。

注意还有要求黑格子连续。

2026.10.17

QOJ6582 Królestwo

考虑偶数长度的路径怎么体现。

可以将边配对,使得每个配对的边都有一个点重合。这个可以直接 DFS 一遍,在 DFS 树中处理。

不妨设一个配对边为 \((u,v),(v,w)\)。那么连边 \((u,w)\)。新图中任意一条路就长度就一定是偶数了。

然后对于度数为奇数的点,建个超级源点跑欧拉回路。相邻两个关键点配一对即可。

时间复杂度 \(O(n+m)\)。

P6305 [eJOI 2018] 循环排序

记排序后的序列为 \(b_{1\sim n}\)。若 \(a_i \ne b_i\),则 \(b_i\to a_i\) 表示这个位置的值需要从 \(a_i\) 变成 \(b_i\)。

不难发现,这么连边之后每个值的入度等于出度。对每个弱联通分量跑欧拉回路,那么就可以将一个点拆成入度个新点了。

这样原图变成若干个置换环。记 \(m\) 为若联通分量数量,即置换环数量;记 \(c\) 为大小不为 \(1\) 的置换环大小和。

显然,当 \(s <c\) 时无解;\(s\ge c\) 时一定有解。

再考虑通过消耗更多的代价来让操作次数变少。

一个简单的想法是将一些置换环合并。具体的,对于置换环 \(x_1\to x_2\to\dots\to x_{a}\to x_1,y_1\to y_2\to\dots \to y_{b}\to y_1\)。操作一次 \((x_a,y_1)\) 就可以将置换环合并成 \(x_1\to x_2\to \dots\to x_{a-1}\to y_1\to y_2\to \dots \to y_b \to x_a\to x_1\)。如果将 \(k\) 个置换环合并,需要 \(2(k-1)\) 的代价和 \(1\) 次操作。

时间复杂度 \(O(n\log n)\)。

2026.10.17

QOJ17155 Fix the Coloring

枚举团中一个点 \(x\)。

对于两个点的情况分类讨论:

  1. 两个点有边连接,且点的颜色相同。那么需要至少一个点变成红色。
  2. 两个点都和 \(x\) 有边连接,且它们之间没有边连接。那么不能同时为红色。
  3. 两个点中的一个和 \(x\) 有边连接,且它们之间有边连接。同样不能同时为红色。
  4. 两个点都不和 \(x\) 有边连接,但它们之间有边连接。同样不能同时为红色。

不难发现,满足这些条件后,和 \(x\) 有连边的红色点两两之间就都有连边了,满足团的性质。

每次边数是 \(m + \text{deg}(x)^2\) 的,由于 \(\sum \text{deg}(i) = 2m\),所以整体复杂度 \(O(n^2)\)。

QOJ18260 白石溪

考虑到着做。

操作相当于每次选择一个 \(a_i>1\),将 $a_i $ 减去 \(2\)(或者 \(1\)),加给旁边两个元素。

对于最小操作次数,考虑 \(i\) 实际操作了几次。记 \(s_i = \sum\limits_{j=1}^{i}a_j\)。可知 \([1,i]\) 要通过操作 \(i\) 传递(或接收)\(|i-s_i|\)。记 \(s'_i = s_i - i\),\(x_i\) 为操作 \(i\) 的次数。

有:\(x_i -x_{i+1} = s'_i\)。

取 \(x_1 = 0\),可得到一组解 \(x_{1\sim n-1}\)。显然,所有解都能表示成 \(X_i = x_i + \delta\) 的形式,那么令 \(\delta = -\min\limits_{}^{}x_i\) 就是最小合法解了。

此时操作次数为 \(\sum (x_i + \delta)\)。

对于构造,不难发现每次操作一个 \(a_i >1\) 的就行了。

时间复杂度 \(O(n+ans)\)。

QOJ14977 樱之魔法

考虑到着做。

不妨设某次操作完后序列为 \(y_{1\sim n}\),之前为 \(x_{1\sim n}\)。那么关系为:

  • \(x_i = y_i\) 或 \(x_i = y_{i-1}\oplus y_i\)。

前者表示不和 \(i-1\) 在一个区间中,后者表示和 \(i-1\) 在一个区间中。

不难发现,当 \(y_{i-1}=1\) 时 \(x_i\) 就可以是一个通配符了。

那么一次操作的实际作用相当于可以同时将一些 \(1\) 或 \(?\) 的下一个数变成 \(?\),当某次操作结束后当前序列能匹配 \(a\) 序列就可以停止了。

还原可以维护每次变成 \(?\) 的位置,再正着推回去。

时间复杂度 \(O(n^2)\)。

CF1207E XOR Guessing

固定前 \(7\) 位为 \(1\),后 \(7\) 位任意。这样随便从 \(2^7\) 中选 \(100\) 个就可以确定 \(x\) 的前 \(7\) 位。后 \(7\) 位也这样做。

2026.10.18

P3943 星空

对 \(a\) 做前缀异或和,得到 \(b_{1\sim n}\)。

区间修改 \([l,r]\) 相当于将 \(b_{l},b_{r+1}\) 都异或上 \(1\)。

要求最后 \(b_1 = 1,b_{2\sim n}=0\)。不妨再将 \(b_1\) 异或上 \(1\),则要求变成 \(b\) 全是 \(0\)。

显然,一次操作 \((x,y)\) 时如果 \(b_{x}=0,b_y=0\) ,那么这次操作就是无用的。

维护 \(b_i = 1\) 的集合 \(S\)。那么一次操作 \((x,y)\) 可以描述成:

  1. $x\in S,y\in S $。删去 \(x,y\)。
  2. \(x\in S,y\notin S\) 或 \(x\notin S,y\in S\)。删去原来在集合中的那个元素,加入不在集合中的那个元素。

一个比较显然的性质是初始 \(|S|\le 2k\)。

对所有可能的操作 \((x,y)\) 建边。直接去枚举哪两个配对,代价是让他们走到同一个点最短路。维护一下 \(f(S)\) 表示当前集合为 \(S\) 的最小代价。

时间复杂度 \(O((2k)nm + (2k)^2n + (2k)^22^{(2k)})\)。

P10231 [COCI 2023/2024 #4] Putovanje

考虑对一个 \(u\) 判定它是否可能成为答案。

记 \(dis(x,y)\) 为 \(x\) 到 \(y\) 最短路。那么 \(u\) 合法,当且仅当对所有 \(d_i\ne -1\) 的 \(i\),均满足 \(d_i - dis(i,u) = 0\)。

可以写成限制:

  1. \(\max\limits_{d_i\ne -1}^{}d_i - dis(i,u)=0\)。这里还要求 \(d_i - dis(i,u)\ge 0\),即最大非负值等于 \(0\)。
  2. \(\min\limits_{d_i\ne -1}^{} d_i - dis(i,u)=0\)。这里还要求 \(d_i - dis(i,u)\le 0\),即最小非正值等于 \(0\)。

对于限制 \(1\),可以直接跑多源最长路。因为如果实际 \(dis'(i,u)\) 大于 \(dis(i,u)\),式子的值会变小,显然不优。

对于限制 \(2\),等价于不存在 \(d_i < dis(i,u)\)。这个看起来并不好做。但反过来,因为需要这个限制来判断的点一定满足了限制 \(1\),那么只要 \(\sum [d_i \ne -1]\) 等于取到最大值的 \(i\) 的数量就肯定不存在 \(d_i < dis(i,u)\) 了。

那么对于每个 \(u\),就只需要维护 \(d_i - dis(i,u)\) 的最大值以及取到最大值的 \(i\) 数量。

后者可以用 bitset 维护。时间复杂度 \(O(\frac{nm}{\omega})\)。

P14596 [COCI 2025/2026 #2] 比赛 / Natjecanje

将包裹分成若干个二元组(一元组)。对于一组 \((x,y)\) 的代价为 \(dis(s,x)+dis(x,y)+dis(y,s)\)。求最小分组代价。

模拟退火即可。

P8043 [COCI 2016/2017 #7] KLAVIR

对 \(A_1A_2\dots A_m\) 建 AC 自动机(或者说 KMP 自动机)。

定义状态函数 \(f_{i}\) 为当前最长匹配到 \(A_1A_2\dots A_i\) 的期望次数。那么有:

  1. 下一个字符是 \(A_i\)。概率 \(\frac{1}{n}\),代价 \(1\)。
  2. 下一个字符不是 \(A_i\)。不妨设它是 \(x\)。概率 \(\frac{1}{n}\),代价 \(1 + f_i - f_{\text{out}(i-1,x)}\)。其中 \(\text{out}(i-1,x)\) 为 AC 自动机上点 \(i-1\) 的 \(x\) 出边对应点。因为这样的代价等价于从 \(\text{out}(i-1,x)\) 开始走到 \(i\) 的代价,而从 \(1\) 到 \(i\) 的任意情况都包含从 \(1\) 到 \(\text{out}(i-1,x)\)。根据期望可加,二者相减就是实际期望次数。

那么转移为:\(f_i =f_{i-1}+ 1 + \frac{1}{n}\sum\limits_{j\ne A_i}^{}(f_i -f_{\text{out}(i-1,x)})\)。

则:\(f_i = nf_{i-1} + n - \sum\limits_{j\ne A_i}^{}f_{\text{out}(i-1,x)}\)。

时间复杂度 \(O(nm)\),空间复杂度 \(O(nm)\)。

考虑优化。根据 AC 自动机的建立,可知对于 \(\text{out}(i,x)\):

  1. \(x=A_{i+1}\)。\(\text{out}(i,x) = i+1\)。
  2. \(x\ne A_{i+1}\)。\(\text{out}(i,x) = \text{out}(fail(i), x)\)。

那么:

\[\begin{aligned}\\ \sum\limits_{j\ne A_i}^{} f_{\text{out}(i-1,x)}&= \sum\limits_{j\ne A_i}^{}f_{\text{out}(fail(i-1),x)}\\ &=(\sum\limits_{j\ne A_{fail(i-1)+1}}^{}f_{\text{out}(fail(i-1),x)})+f_{fail(i-1) + 1}[A_{fail(i-1)+1}\ne A_i]-f_{\text{out}(fail(i-1),A_i)}[A_{fail(i-1)+1}\ne A_i] \end{aligned} \]

最后一项相当于是查询 \(fail\) 树上点到根路径中第一个后一个字符等于 \(A_i\) 的点,先 DFS 一遍维护一下这个编号就行。时间复杂度 \(O(m)\),空间复杂度 \(O(m)\)。

2026.10.20

P9599 [JOI Open 2018] 木琴 / Xylophone

\((i,i+1),(i,i+2)\) 都查一遍。记 \(|p_i-p_{i+1}|=x,|p_{i+1}-p_{i+2}|=y,|p_{i}-p_{i+2}|=z\)。有:

  1. \(x+y=z\)。则 \(p_i = p_{i+1}-x ,p_{i+1}=p_{i+2}-y\) 或 \(p_i = p_{i+1}+x,p_{i+1}=p_{i+2}+y\)。
  2. \(x+y\ne z\)。则 \(p_i = p_{i+1}-x, p_{i+1}=p_{i+2}+y\) 或 \(p_{i}=p_{i+1}+x,p_{i+1}=p_{i+2}-y\)。

这样枚举 \(p_1,p_2\) 的关系,就可以唯一确定后续每个值了。

询问次数 \(2n-3\),时间复杂度 \(O(n\log n)\)。

P15284 [IOI 2015] Scales 天平

首先不难发现 \(Q\) 应该是 \(6\)。

考虑把决策树建出来。

具体的,搜索过程中维护可能的排列集合 \(S\) 以及剩余询问次数 \(stp\)。枚举所有可能的询问方式,一种询问方式会将排列集合分成 \(S_1,S_2,S_3\) 三个部分。

如果 \(3^{stp - 1} < \max(|S_1|,|S_2|,|S_3|)\) 显然不能这么问,因为极端情况下也无法区分。

对于可能的询问方式,定义其熵 \(H = -\sum\limits_{i=1}^{3}(\frac{|S_i|}{|S|})\log(\frac{|S_i|}{|S|})\)。优先尝试搜索 \(H\) 较大的,直到存在一组能够在 \(stp\) 次询问内区分所有排列的询问方式或所有询问方式均不可能为止。

最后把询问路径存下来就得到了决策树。

P2168 [NOI2015] 荷马史诗

每次取前 k 大合并。

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

P1337 [JSOI2004] 平衡点 / 吊打XXX

模拟退火即可。

P14470 [COCI 2025/2026 #1] 松鼠 / Zagi

定义状态函数 \(f(l,r)\) 为在之考虑区间 \([l,r]\) 时的 \(\text{SG}\) 值。

首先一个同色的区间满足 \(f(l,r) = 1\)。

对于非同色区间,其 \(f\) 值等于去掉区间内某种值后得到的子区间 \(f\) 值异或和的 \(\text{mex}\)。

直接做可以做到 \(O(n^2V+q)\)。

一次询问 \([l,r]\),枚举第一次删去的数,设删去的位置为 \(p_{1\sim k}\)。观察剩下的子区间 \([L,R]\),不难发现它们一定满足 \(a_{L-1}\) 或 \(a_{R+1}\) 不在 \([L,R]\) 中出现。这种区间只有 \(O(nV)\) 个。

对于剩下子区间再删数后的情况,不难发现也满足上面的性质。

那么实际有用的区间就只有 \(O(nV)\) 个了。

整体时间复杂度 \(O(nV^2+qV)\)。

P14468 [COCI 2025/2026 #1] 和谐 / Harmonija

这个树没啥用。不妨设问题是一个序列。

定义状态函数 \(f_{i,j}\) 为考虑完前 \(i\) 个点,\(x - y= j\) 的最大价值和。那么:

  • \(f_{i,j} = \max(c_i + f_{i-1,j-1}, p_i + f_{i-1,j+1})\)。

边界限制是 \(-2 \le j \le 2\)。

写成矩阵的形式,问题变成 \(O(q\log n)\) 次查询区间矩阵积。猫树预处理可以做到 \(O(\omega^3 q\log n +\omega^3 n\log n),\omega = 5\)。

P11778 [COTS 2012] 网格覆盖 / ARHIPELAG

如果一个黑色四联通块两两相对位置确定,那么这个连通块的形状就是唯一确定的。

不妨以左上角为基准求相对位置。对连通块维护哈希值,相对位置为 \((x,y)\) 的点定义其哈希值为 \(A^xB^y\)。连通块的哈希值为 \((\sum A^xB^y)\bmod p\)。

每个连通块维护信息:基准点 \((x,y)\);哈希值 \(H\)。

对于原问题,到着做变成合并连通块。有两种情况:

  1. 产生一个新的黑点 \((x_0,y_0)\)。那么有 \(x=x_0,y=y_0,H=A^0B^0\)。
  2. 合并两个连通块。不妨设基准点改变的那个连通块为 \((x_1,y_1,H_1)\);不变的为 \((x_2,y_2,H_2)\);合并后为 \((x,y,H)\)。有:\(x = x_2,y=y_2,H = H_2 + \frac{H_1 \cdot (A^{x_1}B^{y_1})}{A^{x_2}B^{y_2}}\)。

具体维护可以直接用并查集,最后再用个 map 维护每种哈希值的连通块数量即可。

时间复杂度 \(O(nm\log V+q)\)。

P11433 [COCI 2024/2025 #2] 三角 / Trokuti

每次找到一个 \(K_3\) 就删掉。最坏情况下这个 \(K_3\) 中的点分别属于不同的 \(K_3\),此时会使得剩余图中原有 \(K_3\) 数量减 \(3\)。

因为图保证存在 \(2n\) 个 \(K_3\),所以这样做至少能找到 \(\lfloor\frac{2n}{3}\rfloor\) 个 \(K_3\)。

然后随机一下就可以了吧。时间复杂度 \(O(n^4)\) 或者 \(O(n^3)\)。

P11432 [COCI 2024/2025 #2] 流明 / Blistavost

定义状态函数 \(f_{l,r,0/1}\) 为只有 \([l,r]\) 中的灯需要熄灭,当前在 \(l\) 或 \(r\) 的最小代价。

维护覆盖一个点的最大时间 \(T_i\)。那么:

\[f_{l,r,0}=\min(\max(f_{l-1,r,0}+1, t_l), \max(f_{l,r+1,1} +(r+1-l),t_{l}))\\ f_{l,r,1}=\min(\max(f_{l,r+1,1}+1,t_r),\max(f_{l-1,r,0}+(r-(l-1)),t_r)) \]

将区间离散化就可以做到 \(O(n^2)\),空间 \(O(n)\)。

P11391 [COCI 2024/2025 #1] 疑惑 / Zbunjenost

不难发现,回路一定是凸多边形。

每个三角形与跟它边相邻的三角形连边,得到树。那么合法的凸多边形一定唯一对应树上一个连通块。

问题变成对树上连通块计数。

时间复杂度 \(O(n\log n)\)。

P11390 [COCI 2024/2025 #1] 教师 / Učiteljica

容斥。钦定区间不存在数 \(x\),使得 \(x\) 的出现次数 \(cnt\) 满足 \(cnt\in S\)。记这样的区间数量为 \(f(S)\)。那么有 \(\text{ANS} = \sum\limits_{S}^{}(-1)^{|S|}f(S)\)。

枚举 \(S\),再枚举值 \(x\)。可以得到 \(O(n|S|)\) 个形如 \(l\in [a,b],r\in [c,d]\) 的区间 \([l,r]\) 不合法的限制。线段树维护做到 \(O(k2^kn\log n)\)。

2026.10.21

P9910 [COCI 2023/2024 #2] Dizalo

记后缀最小值下标为 \(p_{1\sim k}\)。那么答案就是 \(n + \sum\limits_{i=1}^{k}\sum\limits_{j=1}^{p_i-1}[a_j > a_{p_i}]\)。

记 \(t_i\) 为 \(i\) 被删去的时间,没有则为 \(q+1\)。那么 \(i\) 是后缀最小值的时间区间为 \([\max\limits_{j>i\land a_j < a_i}^{}t_j, t_i - 1]\)。

设当前没被删掉的点为 \((v_i, p_i)\),其中 \(v\) 为值 \(p\) 为下标。那么对于一个后缀最小值 \((V,P)\),贡献就是 \(\sum [v>V \land p < P]\)。又因为 \(v<V\land p>V\) 的点已经被删完了,所以 $\sum [v>V\land p<P] = \frac{\sum [v>V] + \sum[p<P] -\sum [v<V] -\sum [p>P]}{2} $。

树状数组维护即可。

时间复杂度 \(O(n\log n)\)。

2026.10.22

P16458 [UOI 2026] mex plus

\(x,y\) 之间连一条边。

对每个连通块跑一个 DFS 树出来,先不管非树边。

一个简单的贪心是尽可能让分配给 \(A\) 的值的种类多。那么将所有叶子都分配给 \(A\),此时叶子的父亲值分配给了 \(B\)。如果某个叶子的父亲还有父亲,那么叶子的父亲值还能分配给 \(A\)。一直这么做下去,可知最终分配给 \(B\) 的值为树上除叶子外所有点值;分配给 \(A\) 的值为树上除根以外所有点值。

那么让根是树上点值最大的那个就是最优的。

再考虑非树边的贡献,这里让根的度数不小于 \(2\)。对于 \(B\),还是叶子的值分配不到(算上非树边后的叶子);对于 \(A\),发现一条非树边 \(u\to v\)(\(u\) 是 \(v\) 祖先)可以让 \(A\) 直接分配到 \(u\),此时再向上就可以是先分配 \(B\) 了。那么到根的时候根的点值就可以分配给 \(A\)。

总结一下,一个连通块带来的限制就是:

  1. 连通块不存在环。\(\text{mex}(A)\) 不大于连通块中最大点值;\(\text{mex}(B)\) 不大于连通块中最小叶子点值。
  2. 连通块存在环。\(\text{mex}(A)\) 无限制;\(\text{mex}(B)\) 不大于连通块中最小叶子点值。

答案就是所有对 \(A\) 限制的最小值加上所有对 \(B\) 限制的最小值。

对原问题线段树分治,用可撤销并查集与 set 分别维护连通块与限制即可。

时间复杂度 \(O(n\log^2 n)\)。

P13693 [CEOI 2025] Equal Mex

首先这个相同的 \(\text{mex}\) 就是区间 \(\text{mex}\)。

显然,美丽值等于在 \([l,r]\) 中取若干个不重叠的区间 \([l_i,r_i]\),使得每个区间都是极小 \(\text{mex}\) 区间且 \(\text{mex}\) 值与 \([l,r]\) 的 \(\text{mex}\) 值相同时,可以取得的不重叠区间 \([l_i,r_i]\) 数量最大值。因为任意一种合法划分 \([l_i,r_i]\),都可以将它们缩成一个极小区间。

将这 \(O(n)\) 个极小 \(\text{mex}\) 区间找出来,再对每种 \(\text{mex}\) 值扫描线。因为 \(\text{mex}\) 值相同的极小区间不存在包含关系,所以按照 \(r\) 升序之后 \(l\) 也是升序的。

倍增一下即可。时间复杂度 \(O(n\log^2 n)\)。

CF444C DZY Loves Colors

ODT 维护区间染色,线段树维护色彩度即可。

时间复杂度 \(O(n\log n)\)。

CF702F T-Shirts

将衣服按照 \(q\) 从大到小排序,\(q\) 相同的按照 \(c\) 从小到大排。

问题变成:给定 \(b\),每次从左往右找到第一个 \(c_i \le b\) 的,将 \(b\) 减去 \(c_i\)。问会操作多少次。

从前往后枚举每个衣服,维护当前每个人剩余钱数与操作数。那么操作相当于对 \(b_i \ge c\) 的人 \(i\),\(b_i \gets -c_i, ans_i\gets 1\)。

平衡树维护 \(b\) 升序排序的结果,这样相当于是一个后缀 \(-c\) 并将答案 \(+1\) 的操作。因为 \([c,2c]\) 中的数减去 \(c\) 后可能与 \([0,c-1]\) 中的数发生相对位置的变化,此时暴力将 \([c,2c]\) 中的数提出来,减去 \(c\) 后再插进去就是对的。因为每个人只会插入 \(O(\log V)\) 次。

时间复杂度 \(O(n\log n\log V)\)。

P9130 [USACO23FEB] Hungry Cow P

考虑线段树。

线段树上每个节点维护 \(ans, cnt, s\) 分别表示在只考虑当前节点对应区间中的干草时:吃草的天数和,没吃草的天数,溢出的干草数量。

维护 \(f_a(u,x),f_b(u,x),f_c(u,x)\) 分别表示在第 \(l_{u}-1\) 天剩下 \(x\) 这么多干草时,到第 \(r_u\) 天结束时的 \(ans,cnt,s\) 值。

分类讨论:

  1. \(x \le f_b(lson_u,0)\)。此时 \(x\) 对 \(rson_u\) 没有影响。

    \[f_a(u,x) = f_a(lson_u,x) + (f_a(u,0) - f_a(lson_u,0))\\ f_b(u,x) = f_b(lson_u,x) + (f_b(u,0)-f_b(lson_u,0))\\ f_c(u,x) = f_c(u,0) \]

  2. \(x > f_b(lson_u,0)\)。此时会额外溢出。

    \[f_a(u,x) = (\sum\limits_{i=l_u}^{mid}i) + f_a(rson_u, x + s(lson_u) - (mid - l_u+1))\\ f_b(u,x) = f_b(rson_u, x + s(lson_u) - (mid - l_u+1))\\ f_c(u,x) = f_c(rson_u, x + s(lson_u) - (mid - l_u+1)) \]

特别的,对于 \(f(u,0)\) 有:

\[f_a(u,0) = f_a(lson_u,0) + f_a(rson_u, f_c(lson_u,0))\\ f_b(u,0) = f_b(lson_u,0) + f_b(rson_u,f_c(lson_u,0))\\ f_c(u,0) = f_c(rson_u,f_c(lson_u,0)) \]

答案为 \(f_a(root,0)\)。时间复杂度 \(O(n\log^2 n)\)。

P5355 [Ynoi Easy Round 2017] 由乃的玉米田

  1. 对于 \(a+b=x,a-b=x\)。跑莫队。将 \(a+b = x\) 写成 $ (V - a)-b = V-c$。这样就可以直接 bitset 查了。复杂度 \(O(n\sqrt{n} + \frac{n^2}{\omega})\)。

  2. 对于 \(a\times b = x\)。跑莫队。枚举 \(\min(a,b)\) 即可。复杂度 \(O(n\sqrt{n})\)。

  3. 对于 \(a\div b = x\)。

    1. 如果 \(x > \sqrt{n}\),则 \(b \le \sqrt{n}\),跑莫队之后暴力枚举。复杂度 \(O(n\sqrt{n})\)。
    2. 如果 \(x <\sqrt{n}\)。枚举 \(x\) 再枚举 \(i\)。可以得到当 \(b = \frac{a_i}{x}\) 时合法。么可以得到 \(O(n)\) 个点对 \((L,R)\),表示当询问 \((l,r,x)\) 满足 \(l \le L ,R \le r\) 时有解。从左往右扫,维护前缀 \(L\) 最大值即可。时间复杂度 \(O(n\sqrt{n})\)。

P5046 [Ynoi2019 模拟赛] Yuno loves sqrt technology II

分块。

维护 \(f(p,x) = \sum\limits_{i=l_p}^{\min(x,r_p)}[a_i > a_x]\),\(g(p,q) = \sum\limits_{i=l_q}^{r_q}f(p,i),h(p,q) = \sum\limits_{w=1}^{p}g(w,q)\)。

这个的复杂度 \(O(n + \frac{n^2}{B})\)。

对于一次查询,先把对整块的贡献通过 \(f,g,h\) 求出来。现在变成两个散块之间的贡献。提前将每个块内元素排序,然后归并起来就行了。复杂度 \(O(mB+\frac{nm}{B}+n\log n)\)。

平衡得到 \(O(n\sqrt{n})\)。

P9986 [Ynoi2079] r2pspc

莫队。压位做到 \(O(\frac{nm}{\omega})\)。

2026.10.23

CF1340F Nastya and CBS

分块。

先对块内预处理栈,再考虑从左往右将每个块的栈合在一起。

散块可以暴力,整块需要满足栈中前缀是右括号,后缀是左括号(否则出现形如 \((]\) 一定不合法)。并且从左往右合并的任意时刻当前栈中都不会有右括号。

用哈希判断当前整块的右括号是不是能被当前栈中左括号一段后缀匹配集合。

时间复杂度 \(O(n\sqrt{n})\)。

Loj176 动理序列最值

KTT 板子。求第 \(Y\) 大可以每次找到最大的,然后删掉它。

P5693 EI 的第六分块

对于最大子段和,线段树上每个点维护 \(a,b,c,d\) 分别表示区间和、前缀和最大值、后缀和最大值、最大子段和。

记左儿子信息为 \(a_1,b_1,c_1,d_1\);右儿子信息为 \(a_2,b_2,c_2,d_2\)。合并左右儿子:

\[\begin{aligned}\\ a &= a_1+a_2\\ b&=\max(b_1,a_1+b_2)\\ c&= \max(c_2,a_2+c_1)\\ d &= \max(d_1,d_2,c_1+b_2) \end{aligned} \]

将 \(a,b,c,d\) 描述成 \((l_1,a),(l_2,b),(l_3,c),(l_4,d)\)。以 \((l_4,d)\) 举例,它表示在决策不变时给区间每每个元素增加 \(x\) 会使 \(d\) 增加 \(l_4x\)(也就是说 \(l_4\) 维护的最大子段和的长度)。

这样就可以用 KTT 了。再维护一个阈值 \(lim\),表示如果区间加的值超过 \(lim\) 就会改变 \((l_2,b),(l_3,c),(l_4,d)\) 中至少一个。在超过 \(lim\) 时暴力往子树内更新即可。

复杂度 \(O(n\log^3 n + q\log n)\)。

P6792 [SNOI2020] 区间和

取 \(\max\) 先用吉司机。维护区间最小值和次小值,记为 \(m_1,m_2\)。分情况讨论:

  1. \(x \le m_1\)。不会改变任何值。
  2. \(m_1 < x < m_2\)。会将最小值改成 \(x\)。
  3. \(m_2 \le x\)。传到子树中继续做。

那么问题变成若干个修改区间最小值的操作。

和上一题一样维护四个一次函数,只是 \(l\) 的含义变成最小值的数量。

时间复杂度 \(O(n\log^3 n + q\log n)\)。

P11622 [Ynoi Easy Round 2025] TEST_176

\(x \le a_i - x\) 等价于 \(x \le \lfloor\frac{a_i}{2}\rfloor\)。

对 \(r\) 扫描线,问题变成每次将 \(x \le \lfloor\frac{a_i}{2}\rfloor\) 的 \(x\) 变成 \(a_i-x\),求某个时刻某个下标上的值。

平衡树维护乘法,加法 \(tag\)(注意这里乘法会交换儿子)。还需要支持有交合并。

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

P15555 [CCPC 2025 哈尔滨站] 比赛

首先分组分成 \(1,2,3,\dots, k,1,2,3,\dots, k\) 不劣。因为交换 \(i,j\)(\(i<j\)) 的分组更优当且仅当 \(a_i > a_j\),又因为区间是随 \(i\) 增大右移的,所以一定可以让 \(a_j = a_i\)。

问题变成 \(k=1\)。贪心地,能填小就填小。有关系:\(a_i = \max(a_{i-1}+D,l_i)\),初始 \(a_{L} = l_L\)。无解当且仅当存在 \(a_i > r_i\)。

考虑 \(a_i > r_i\) 的情况是怎么产生的。一定是从某个 \(a_j = l_j\) 开始,中途转移均为 \(a_k = a_{k-1}+D\),到 \(i\) 时满足 \(a_i > r_i\)。那么不等式可以写成 \(l_j + (i-j)\cdot D > r_i\)。

也就是说,对于询问 \((L,R,D)\) 有解,当且仅当不存在 \(L \le i \le j \le R\),使得 \(l_i +(j-i)\cdot D>r_j\)。记 \(p_i = l_i-r_i,q_i = r_i-r_{i-1}\),式子等价于 \(p_i+\sum\limits_{k=i+1}^{j}(D-q_k) > 0\)。

这是一个最大子段和的形式,相当于给区间 \([L,R]\) 中每个元素增加 \(D\) 后求最大子段和。考虑用 KTT 维护。线段树每个节点维护 \(a,b,c,d,e,f\) 分别表示:\(p_l + \sum\limits_{i=l+1}^{r}q_i\),\(p_l + \max\limits_{i=l}^{r}(\sum\limits_{j=l+1}^{i}q_j)\),\(\max\limits_{i=l}^{r}(p_i + \sum\limits_{j=i+1}^{r}q_j)\),\(\max\limits_{l\le i\le j\le r}^{}(p_i + \sum\limits_{k=i+1}^{j}q_k)\),\(\sum\limits_{i=l}^{r}q_i\),\(\max\limits_{i=l}^{r}(\sum\limits_{j=l}^{i}q_j)\)。

记左儿子信息为 \(a_1,b_1,c_1,d_1,e_1,f_1\);右儿子信息为 \(a_2,b_2,c_2,d_2,e_2,f_2\)。那么有:

\[\begin{aligned}\\ a &= a_1 + e_2\\ b&= \max(b_1, a_1+f_2)\\ c&= \max(c_2, c_1 + e_2)\\ d&= \max(d_1,d_2, c_1 + f_2)\\ e&=e_1+e_2\\ f&=\max(f_1, e_1+f_2) \end{aligned} \]

将询问的 \(D\) 从小到大排序,修改变成全局加 \(\Delta(D)\) 即可。

2026.10.24

CF932F Escape Through Leaf

李超线段树直接合并就行了。

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

2026.10.26

P8969 幻梦 | Dream with Dynamic

标记可以写成 \(\text{popc}(\text{popc}(\text{popc}(x+A)+B)+C)\dots\)。

注意到 \(\text{popc}(x+A)\) 只有 \(O(\log V)\) 种。那么就可以对每种分开维护标记。

标记写成 \(f(A,y)\),表示如果 \(\text{popc}(x+A) = y\),那么最终的值为 \(f(A,y)\)。特别的,若 \(A = -1\),则表示没有进行过 \(\text{popc}\) 操作,此时最终值为 \(x+f(A,y)\)。

考虑标记的下传。问题变成复合 \(f_1(A_1,y_1)\) 和 \(f_2(A_2,y_2)\)。分情况讨论:

  1. \(A_1 = -1\)。
    1. \(A_2 = -1\)。有 \(f(-1,0) = f_1(-1,0)+f_2(-1,0)\)。
    2. \(A_2\ne -1\)。有 \(f(A_2+f_1(-1,0),y) = f_2(A_2,y)\)。
  2. \(A_1 \ne -1\)。
    1. \(A_2 = -1\)。有 \(f(A_1,y) = f_1(A_1,y)+f(-1,0)\)。
    2. \(A_2\ne -1\)。有 \(f(A_1,y) = f_2(A_2,\text{popc}(f_1(A_1,y)+A_2))\)。

区间加法相当于给区间复合 \(f(-1,0)=x\)。

区间取 \(\text{popc}\) 相当于给区间复合 \(f(0,x) = x\)。

时间复杂度 \(O(n\log n\log V)\)。

P8862 「KDOI-03」还原数据

到着做,变成区间减法。\(2\) 操作的 \(x\) 就是当前时刻的区间最小值。

时间复杂度 \(O(n\log n)\)。

CF1446D2 Frequency Problem (Hard Version)

首先答案区间中的众数至少有一个是整个序列的众数。

考虑调整证明,如果这个区间中的众数都不是整个序列的众数,一定可以往左右拓展,直到某个时刻整个序列众数中有一个恰好是区间众数。显然,因为区间 \([1,n]\) 的众数就是整个序列的众数,所以这样的时刻一定存在。

先排除掉整个序列众数不唯一的情况(此时答案显然为 \(n\))。设这个众数为 \(x\)。

问题变成找到长度最大的区间 \([l,r]\),使得 \([l,r]\) 中存在 \(y\ne x\),满足 \(y\) 的出现次数等于 \(x\) 的出现次数。

维护 \(c_{i} = \sum\limits_{j=1}^{i}[a_j = x]\)。条件等价于 \(y\) 的出现次数等于 \(c_r - c_{l-1}\)。

枚举 \(y\),对 \(y\) 也做这种前缀和得到 \(d_{1\sim n}\)。问题变成求满足 \(d_r -c_r= d_{l-1} - c_{l-1}\) 的 \([l,r]\) 中,\(r-(l-1)\) 的最大值。显然,\(d_i - c_i\) 的值只有 \(O(cnt_x + cnt_y)\) 种。

对于 \(cnt_y\) 比较小的情况,枚举众数出现次数双指针即可。

时间复杂度 \(O(n\sqrt{n})\)。

P9288 [ROI 2018] Innophone

从小到大枚举 \(a\)。那么问题变成维护可重集 \(S\),需要支持加入 \(y\),查询 \(\max\limits_{b }^{}b \cdot (\sum\limits_{y\in S}^{}[y\ge b])\)。

离散化,维护 \(f(i) = \sum\limits_{y\in S}[y \ge i]\)。那么加入一个 \(y\) 会将 \(i\in [1,y]\) 的 \(f(i)\) 都增加 \(1\)。相当于是前缀 \(f\) 值加 \(1\),维护全局 \(\max\limits_{i} g(i)\cdot f(i)\)。

直接上 KTT 即可。时间复杂度 \(O(n\log^3 n)\)。

CF1178G The Awesomest Vertex

又是个 KTT 板子。放 dfn 序上即可。复杂度 \(O(n\log^3 n)\)。

P7811 [JRKSJ R2] 你的名字。

根号分治。

当 \(k \le B\) 时对每个 \(i\) 枚举 \(k\)。问题变成区间查询最小值。用 \(O(1)-O(\sqrt{n})\) 的分块维护做到 \(O(nB + n\sqrt{n})\)。

当 \(k > B\) 时。\(a \bmod k = \max\limits_{i\cdot k \le a}^{}(a - ik)\)。枚举 \(i\),问题变成区间查询不小于 \(ik\) 的数中最小值。 将询问和 \(a_{1\sim n}\) 按照值从大到小枚举,相当于是 \(O(n)\) 次单点修改,\(O(\frac{nV}{B})\) 次区间查询最小值。这个对序列分块,散块只会影响块内 \(O(\sqrt{n})\) 个前缀或后缀,整块猫树,影响的前缀或后缀是 \(O(\sqrt{n}+\frac{\sqrt{n}}{2}+\frac{\sqrt{n}}{4}\dots) = O(\sqrt{n})\) 的。区间查询就对开头结尾两个散块查前后缀,中间在猫树上面查。复杂度 \(O(\frac{nV}{B} + n\sqrt{n})\)。

整体时间复杂度 \(O(n\sqrt{V}+n\sqrt{n})\)。

P14363 [CSP-S 2025] 谐音替换

对 \(s\) 建 AC 自动机。

对于一组询问 \((t_1,t_2)\),枚举替换区间右端点。记这两个前缀在 \(fail\) 树上位置分别是 \(p_1,p_2\)。那么贡献等价于所有 \(s_{i}\) 中,满足 \(|s_{i,1}|\ge l\) 且 \(s_{i,1}\) 在 \(fail\) 树上位置是 \(p_1\) 祖先,\(s_{i,2}\) 是 \(p_2\) 祖先的 \(i\) 数量。

这个可以写成三维偏序的形式。复杂度 \(O(L\log L + n\log^2 n)\)。

注意到 \(s_i\) 可以用来替换,当且仅当 \(s_{i,1}\) 和 \(s_{i,2}\) 不同位置数量等于 \(t_{i,1}\) 和 \(t_{i,2}\) 不同位置数量。那么 \(|s_{i,1}|\ge l\) 就可以改成 \(v_{i} = V\)。变成二维偏序的形式。复杂度 \(O(L\log L + n\log n)\)。

P17801 [CXOI2026] 大潘小潘向前 p

每个下标有限制 \(1 \le a_i \le b_i\)。

容斥。定义状态 \(g(x)\) 为钦定有 \(x\) 个不下降的位置的方案数。

那么对于 \(k\) 的答案就是 \(\sum\limits_{x\ge n-k}^{}(-1)^{x-(n-k)}\binom{x}{n-k}g(x)\)。

根据钦定的位置,可以把序列分成若干个区间 \([l_i,r_i]\)。

考虑对一个区间计数,重编号为 \(1\sim k\)。因为 \(a_i \le a_{i+1}\),所以 \(i+1\) 的上界实际上是 \(\min\limits_{j\ge i}^{} b_j\)。设这个后缀 \(\min\) 数组为 \(c_{1\sim k}\)。

定义状态函数 \(f(l,r)\) 为钦定区间 \([l,r]\) 是不下降的方案数。枚举 \(r\),得到数组 \(c_{1\sim r}\)。有 \(f(l,r) = \sum\limits_{k=l+1}^{r+1}(-1)^{k-l-1}f(k,r)\binom{c_l}{k-l}\)。这个是简单的,因为在只考虑 \(a_{l}\) 时会出现 \(a_{l}> a_{l+1}\) 的情况;在只考虑 \(a_l > a_{l+1}\) 时会出现 \(a_{l}>a_{l+1}>a_{l+2}\) 的情况……

再维护 \(dp_i(x)\) 为考虑完 \([1,i]\),一共有 \(x\) 个位置钦定不下降的方案数。有 \(dp_{i}(x) = \sum\limits_{j<i}^{}dp_{j}(x - (i-j-1))f(j+1,i)\)。

最后 \(g(x) = dp_n(x)\)。时间复杂度 \(O(\sum n^3)\)。

P17759 「RSOI-3H」数组划分 / partition

首先这 \(k\) 个限制是没有任何作用的,对每个 \(r\) 二分找到最小的 \(p_r\),使得不存在 \((u,v)\in S \land p_r \le u,v \le r\) 即可。

定义状态函数 \(f_{i}\) 为最后一个段右端点在 \(i\) 的方案数。有转移:\(f_i = \sum\limits_{j=p_i-1}^{i-1}f_j - \sum\limits_{j = p_i-1}^{i-1}f_j[w(j+1,i)=1]\)。其中 \(w(l,r)\) 为区间最大值与最小值的 \(\gcd\)。

\([\gcd(x,y) = 1] = \sum\limits_{d \mid x \land d\mid y}^{}\mu(d)\)。用两个单调栈维护最小值和最大值,每次暴力枚举约数 \(d\)。相当于是查询另一边也包含这个约数 \(d\) 的 \(f\cdot \mu(d)\) 之和。

复杂度为 \(O(n\tau(V)\log n)\),其中 \(\tau(V)=\max\limits_{i=1}^{V}2^{\omega(i)}\),其中 \(\omega(i)\) 为 \(i\) 的不同质因子数量。

P16141 集合(set)

定义状态函数 \(f(i)\) 为钦定前 \(i\) 个质数在 \(P\) 中的方案数,设 \(p_i\) 为第 \(i\) 个质数。那么答案等于 \(\sum\limits_{i}^{}(f(i - 1)-f(i))\cdot p_i\)。

对质数分类,设阈值为 \(B\)。

对于 \(p_i \le B\) 的质数,从 \(1\) 到 \(n\) 加入每个数。维护 \(f_i(S)\) 表示考虑完 \([1,i]\),当前 \(\{p_i\in P \land p_i \le B\} = S\) 的方案数。记 \(cnt\) 为 \(\le B\) 的质数数量,那么复杂度为 \(O(n2^{cnt})\)。这里 \(B\) 取到 \(50\) 以内都是可以的,注意到 \(50 > \sqrt{n}\),那么不妨就让阈值等于 \(\sqrt{n}\)。

对于 \(p_i > B\) 的质数,只有 \(O(\frac{n}{B})\) 个整数包含它。因为 \(B = \sqrt{n}\),所以对于每个 \(x\) 只会包含一个这样的 \(p_i\)。对每个 \(p_i\) 预处理 \(g_i(S)\) 表示只考虑包含 \(p_i\) 这个质因子的数时,\(\{p_i\in P\land p_i \le B\}=S\) 的方案数。

那么 \(f(i)\) 就相当于若干 \(g\) 的或卷积了。做若干次高维前缀和即可。

时间复杂度 \(O(n2^{\pi(\sqrt{n})} + \pi(n)\pi(\sqrt{n})2^{\pi(\sqrt{n})})\)。其中 \(c(x)\) 为 \([1,x]\) 中质数数量。

2026.10.27

P17551 [JAG 2026 Summer Camp #2] Take Many ABA

对于每次删除的子序列 ABA,将第一个 \(A\) 标记为 \(1\),中间的 \(B\) 标记为 \(2\),第二个 \(A\) 标记为 \(3\)。没被标记的点为 \(0\)。

求前缀和,记三种标记的数量为 \(cnt_{1\sim 3}(i)\)。那么一种标记合法,当且仅当满足以下条件:

  1. 对于任意 \(1\le i \le n\)。\(cnt_1(i)\ge cnt_2(i) \ge cnt_3(i)\)。
  2. 对于 \(i=n\)。\(cnt_1(i)=cnt_2(i)=cnt_3(i)\)。

考虑强制将没被标记的 \(A\) 标记成 \(1\),这样显然也是合法的。设 \(c(i)\) 为 \(1\sim i\) 中 \(A\) 的数量,条件变成:

  1. 对于任意 \(1\le i \le n\)。\(cnt_1(i)\ge cnt_2(i)\ge c(i) - cnt_1(i)\)。
  2. 对于 \(i=n\)。\(cnt_1(i) \ge cnt_2(i) = c(i)-cnt_1(i)\)。

贡献为 \(cnt_2(n)\)。

考虑判定 \(cnt_2(n)\) 能否不小于 \(k\)。到着做,维护 \(cnt_1(i) -cnt_2(i) = a,cnt_2(i)-(c(i)-cnt_1(i))=b\)。分情况讨论:

  1. \(T_i = A\)。可以转移到 \((a-1,b),(a,b+1)\)。
  2. \(T_i = B\)。可以转移到 \((a,b),(a+1,b-1)\)。

要求最后到 \((0,0)\),且任意时刻 \(a\ge 0,b\ge 0\)。初始状态为 \((c(n) - 2k, 0)\)。

注意到最优情况一定是对于一段前缀 \(A\),转移到 \((a-1,b)\);对于剩下的 \(A\),转移到 \((a,b+1)\)。因为转移 \(B\) 时在 \((a,b)\) 变化的情况对 \(b\) 是最不利的。

是不是做复杂了,这个结论好像能直接看出来……

那么判定变成:将后 \(k\) 个 \(A\) 标记成 \(3\),其余 \(A\) 标记成 \(1\),看是否能找到一组合法标记为 \(2\) 的点。

为了不算重,一个简单的映射是从后往前做时如果遇到 \(T_i=B\),在 \(b \ge 1\) 时强制转移到 \((a+1,b-1)\)。

那么定义状态函数 \(f_i(a,b,0/1)\) 为考虑完 \(i\sim n\),当前状态为 \((a,b)\) 且是否将 \(i\) 后面第一个 \(A\) 标记成 \(1\)(没有则默认标记成 \(1\))的方案数。能直接这么定义的理由有两个:

  1. 加强了策略,这样保证不算重。
  2. 如果初始状态为 \((c(n)-2k,0)\),无论中间 \(?\) 实际是什么,对于所有可能且合法的状态,如果最后到达 \((0,0)\),且经历了从将 \(A\) 标记成 \(1\) 到标记成 \(3\),就一定唯一确定了 \(k\)。同时 \(c(n)\) 也是确定的,那么路径存在且唯一。

初始化 \(f_{n+1}(x,0,1)=1\)。考虑转移:

  1. \(T_i = A\)。

    \[\begin{aligned} f_{i}(a,b+1,1)&\gets f_{i+1}(a,b,1)\\ f_{i}(a-1,b,0)&\gets f_{i+1}(a,b,0)+f_{i+1}(a,b,1)\\ \end{aligned} \]

  2. \(T_i = B\)。

    \[\begin{aligned}\\ f_i(a,b,s)&\gets f_{i+1}(a,b,s)[b = 0]\\ f_{i}(a+1,b-1,s)&\gets f_{i+1}(a,b,s)[b > 0] \end{aligned} \]

答案为 \(f_{1}(0,0,0)\),注意需要减去 \(k = 0\) 的情况。对于一个 \(i\),可能有效的 \((a,b)\) 至少需要满足 \(2b+a \le i\)。那么有效状态数就是 \(O(\sum\limits_{i=1}^{n}\sum\limits_{a=0}^{i}(i-a) )=O(\frac{n^3}{\alpha})\) 的,其中 \(\alpha = 6\)。

时间复杂度 \(O(\frac{n^3}{\alpha}),\alpha = 6\)。

P17407 【MX-X31-T3】「FAOI-R14」数列计数 2025

尝试找一些性质。

首先不存在 \(i\),使得 \(a_i \in (n,2n]\)。因为 \(a_i = n + x\) 可以被 \(i = n,j = x\) 凑出来,此时 \(a_n + a_j > a_n\) 一定不在集合中。

同理,如果 \(a_x \in (x,n]\),设最大的下标就是 \(x\),那么一定存在 \(i=x, j = a_x - x\),此时 \(2n \ge a_x + a_{j}> a_x\),而 \(a_{x+1} > 2n\),所以一定不在集合中。

那么 \(a\) 序列一定是一段前缀满足 \(a_{i} = i\),一段后缀满足 \(a_i \in (2n,m]\)。那么答案就是 \(\sum\limits_{i=0}^{n}\binom{m-2n}{i}\)。

问题变成求 \(\sum\limits_{x = L}^{R}\sum\limits\limits_{i=0}^{n}\binom{x}{i}\)。

\[\begin{aligned}\\ f(R) &=\sum\limits_{x=0}^{R}\sum\limits_{i=0}^{n}\binom{x}{i}\\ &=\sum\limits_{x=0}^{R}\sum\limits_{i=0}^{n}\binom{x-1}{i}+\binom{x-1}{i-1}\\ &=2f(R - 1) - \sum\limits_{x=0}^{R-1}\binom{x}{n}\\ &=2f(R - 1) - \sum\limits_{x=0}^{R-1}\binom{x}{n}\binom{R-1-x}{0}\\ &=2f(R-1)-\binom{R}{n+1} \end{aligned} \]

时间复杂度 \(O(r)\)。

P15650 [省选联考 2026] 摩卡串

考虑对 \(s\) 建 KMP 自动机。

定义状态函数 \(f_{i}(j,a,b,0/1)\) 为当前长度为 \(i\),匹配到点 \(j\),严格小于的有 \(a\) 对,在之前某个时刻满足 \(t_{x} < s_{x - l+1}\) 且 \(t[l:x-1]=s[:x-l]\) 的 \(l\) 数量为 \(b\)(这里 \(l\) 的范围为 \([1,i-j]\)),且是否在某个时刻匹配完 \(s\) 的可行性。

记 \(\text{out}(i,x)\) 为点 \(i\) 在 KMP 自动机上出边 \(x\) 到达的点,\(cnt_i\) 为 \(fail\) 树上 \(i\) 到根中除根外点的数量。

考虑转移:

  1. \(j < n\) 且 \(t_i = s_{j+1}\)。一共有 \(c = b + cnt_{j+1}-[j =n-1]\) 个 \(l\) 满足 \(t[l:i]\) 比 \(s\) 小。\(f_i(j+1,a+c,b,s \lor [j=n-1])\gets f_{i-1}(j,a,b,s)\)。
  2. \(j < n\) 且 \(t_i \ne s_{j+1}\)。记 \(j' = \text{out}(j,s_{j+1}\oplus 1)\)。一共有 \(c = b + (cnt_j - cnt_{j'})[s_{j+1}=1]\) 个 \(l\) 满足条件。\(f_i(j',a+c,b+(cnt_j-cnt_{j’})[s_{j+1}=1],s)\gets f_{i-1}(j,a,b,s)\)。
  3. \(j = n\)。记 \(j' = \text{out}(j,x)\)。\(f_i(j',a+b,b,s)\gets f_{i-1}(j,a,b,s)\)。

初始化 \(f_{0}(0,0,0)=1\)。最后长度就是最小的 \(i\),使得存在 \(f_i(j,k,x,1)=1\)。

注意到对于 \(f_{i}(j,a,b,c)\),状态有用至少满足 \(a \ge \frac{b(b+1)}{2}\)。那么合法状态 \((a,b)\) 就只有 \(k\sqrt{k}\) 个。时间复杂度 \(O(nk\sqrt{k})\)。

还原到着推回来就行。

posted @ 2026-10-03 21:45  harmis_yz  阅读(47)  评论(1)    收藏  举报