对于某个集合 S ⊆ { 1 , ⋯ , n } S\subseteq\{1,\cdots,n\} S⊆{1,⋯,n},考虑能不能删去 S S S。
对于任意 x ∈ S x\in S x∈S,连边 x → x − 2 x\to x-2 x→x−2(如果 x − 2 ∈ S x-2\in S x−2∈S)及 x → x + k x\to x+k x→x+k(如果 x + k ∈ S x+k\in S x+k∈S),那么能把 S S S 删去当且仅当这张图是一个 DAG。
于是我们先对所有点都这么连边形成图 G G G,那么 S S S 合法当且仅当 S S S 在 G G G 中的导出子图是个 DAG,即无环。
对于所有 x → x − 2 x\to x-2 x→x−2 的边,它们形成了两条链,分别称为奇链和偶链。然后我们对 k k k 的奇偶性分类讨论:若 k k k 是偶数,那么这两条链是不连通的(独立的),而无环相当于要求每条链中不连续选 k / 2 + 1 k/2+1 k/2+1 个点,这个方案数很好统计(注意数据范围不大,暴力 DP 即可)。
若 k k k 是奇数,情况就复杂些。首先,若出现了环,那么一定经过了正偶数条 x → x + k x\to x+k x→x+k 的边(经过一次会改变一次当前点的奇偶性)。接下来我们证明,一个简单环必定只经过了恰好 2 2 2 条 x → x + k x\to x+k x→x+k 的边。
对于任意一个简单环 C C C,取其编号最小的点 a a a,那么环中 a a a 的上一个点一定是 a + 2 a+2 a+2,下一个点一定是 a + k a+k a+k(记为 b b b)。而且我们发现,对于 a , a + 2 , ⋯ , b − 1 a,a+2,\cdots,b-1 a,a+2,⋯,b−1 中的任意一个点 x x x, x x x 在环中都不可能是 + k +k +k 得到的(否则 a a a 不是最小点),于是我们已经可以确定 C C C 的一部分形态,如上图左上。
接着, b b b 在环中接下来肯定是先走若干步 − 2 -2 −2(可以是 0 0 0 步,但不能超过 a a a)走到 c c c,然后再走一步 + k +k +k 走到 d d d,如上图左下。
接着,如上图右,我们又继续考虑 e = b + 1 e=b+1 e=b+1 这个点是从哪来的,若它是 + k +k +k 得到的,那么就必然要经历从 b − 1 , b b-1,b b−1,b 右侧到 b − 1 , b b-1,b b−1,b 左侧的过程(从 d d d 经过若干步到达 a + 1 a+1 a+1),这个过程中一定会再次经过 b − 1 , b b-1,b b−1,b 中的某一个点,这就与该环是简单环矛盾了。从而, e e e 是从 e + 2 e+2 e+2 来的。类似地,可以推出 b + 1 , b + 3 , ⋯ , d − 2 b+1,b+3,\cdots,d-2 b+1,b+3,⋯,d−2 中的每一个点 x x x 都是从 x + 2 x+2 x+2 来的,这就和 d d d 接起来了。
于是 C C C 只有可能是 a → 一步 + k b → 若干步 − 2 c → 一步 + k d → 若干步 − 2 a a\xrightarrow{\text{一步}+k}b\xrightarrow{\text{若干步}-2}c\xrightarrow{\text{一步}+k}d\xrightarrow{\text{若干步}-2}a a一步+kb若干步−2c一步+kd若干步−2a 的形态。
那么,现在限制改为了, S S S 在 G G G 中的导出子图不能出现环,且该环恰经过两次 + k +k +k,如下图左上。
假设 S S S 已经选好了,怎么快速判断是否存在这样的环:可以从每个 S S S 中的奇数编号的点 x x x 开始,按如下方式找一条路径(称为 x x x 的找环路)并检查:
-
找到最小的 y y y 使得 { y , y + 2 , ⋯ , x − 2 , x } ⊆ S \{y,y+2,\cdots,x-2,x\}\subseteq S {y,y+2,⋯,x−2,x}⊆S。
-
找到最小的 z z z 使得 z ∈ { y , y + 2 , ⋯ , x − 2 , x } z\in\{y,y+2,\cdots,x-2,x\} z∈{y,y+2,⋯,x−2,x} 且 z + k ∈ S z+k\in S z+k∈S。若找不到这样的 z z z 那么跳过从 x x x 开始的检查。
-
找到最小的 w w w 使得 { w , w + 2 , ⋯ , z + k − 2 , z + k } ⊆ S \{w,w+2,\cdots,z+k-2,z+k\}\subseteq S {w,w+2,⋯,z+k−2,z+k}⊆S。
-
考虑路径 P = x → x − 2 → ⋯ → z → z + k → z + k − 2 → ⋯ → w P=x\to x-2\to \cdots\to z\to z+k\to z+k-2\to \cdots\to w P=x→x−2→⋯→z→z+k→z+k−2→⋯→w,若 P P P 长度大于等于 k + 2 k+2 k+2,那么我们就找到了一个环。
如上图左下,图中的红蓝两条路径就是从两个不同的 x x x 开始的找环路。
容易证明,按照上述方式,若找不到任何一个环,那么图中就确实不存在环(因为从我们所述的 z z z 跳到 z + k z+k z+k,是能使得 P P P 的长度尽量大的)。
那么考虑 DP。如上图右,设 f i , ℓ 1 , ℓ 2 f_{i,\ell_1,\ell_2} fi,ℓ1,ℓ2 表示考虑完 [ 1 , i ] [1,i] [1,i] 中的奇数点和 [ 1 , i + k ] [1,i+k] [1,i+k] 中的偶数点,其中从 i i i 开始的找环路经过的点数为 ℓ 1 \ell_1 ℓ1,而从 i + k i+k i+k 开始不断 − 2 -2 −2 所能经过的点的个数为 ℓ 2 \ell_2 ℓ2 的方案数。
转移的时候,考虑从 i + 2 i+2 i+2 开始的找环路(假设 i + 2 ∈ S i+2\in S i+2∈S):若 i ∈ S i\in S i∈S 且存在从 i i i 开始的找环路,那么从 ℓ 1 \ell_1 ℓ1 转移过来;否则从 ℓ 2 \ell_2 ℓ2 转移过来。转移是 O ( 1 ) O(1) O(1) 的。
时间复杂度 O ( n k 2 ) O(nk^2) O(nk2),注意 DP 时若 ℓ 2 > k + 2 \ell_2> k+2 ℓ2>k+2 我们可以直接把它看做 k + 2 k+2 k+2。