2023.01.15 题目选讲 学习笔记

讲课人:唐绍轩。

WC2023 Day3 下午的课。

1.P8490 [IOI2022] 鲶鱼塘

设第 \(i\) 列覆盖了 \((i,0),\cdots,(i,k_i)\) 这些格子,那么对于第 \(i\) 列会被算入答案的格子的纵坐标应满足 \(>k_i\)\(\le\max(k_{i-1},k_i,k_{i+1})\)。假设我们对第 \(i\) 列指定一个 \(q_i\) 满足 \(\max(i-1,1)\le q_i\le \min(i+1,n)\),也就是在 \(i-1,i,i+1\) 这三列中随便钦定一个最大值,那么答案不会变大。

考虑 dp,设 \(f_{i,0/1,0/1}\) 表示前 \(i\) 列,\(q_i\) 是否确定,\(q_{i+1}\) 是否确定,此时的最大权值。转移加入第 \(i+1\) 列,枚举 \(k_{i+1}\),并枚举 \(q_i,q_{i+1},q_{i+2}\) 是否等于 \(i+1\) 即可。注意到 \(k_i\) 本质不同的取值是 \(i-1,i,i+1\) 这三列特殊格子数总和的级别的,所以总的 \(k\) 的枚举量是 \(O(m)\) 的。

总时间复杂度 \(O(n+m\log m)\)\(O(n+m)\)(桶排),空间复杂度 \(O(n+m)\)

2.P8492 [IOI2022] 无线电信号塔

首先考虑 \(L=0,R=N-1\) 时怎么做。假设 \(D\) 固定,那么 \(\max(H_i,H_j)\le H_k-D\) 等价于 \(H_i\le H_k-D,H_j\le H_k-D\),因此对每个 \(i\) 找到 \(l_i,r_i\) 分别表示 \(i\) 左边/右边第一个至少为 \(H_i+D\) 的位置,这里考虑令 \(H_{-1}=H_{N}=\inf\),这样有 \(-1\le l_i,r_i \le N\)。考虑所有开区间 \((l_i,r_i)\),一个结论是任意两个区间要么相离要么包含,于是可以贪心地选择所有极小区间。另一个结论是,每个开区间都对应大根笛卡尔树上的一棵子树,这是因为 \(\min(H_{l_i},H_{r_i})>\max_{j=l_i+1}^{r_i-1} H_j\)。所以我们建出笛卡尔树,依次判断每棵子树是否可以成为极小开区间。

假设子树 \(i\) 在原序列上对应的区间为 \([mn_i,mx_i]\),可以发现,这棵子树能成为极小开区间首先要满足区间内最小的数向左向右找第一个至少比它大 \(D\) 的数时不能越过 \(mn_{i}-1\)\(mx_{i}+1\),即 \(\min_{j=mn_i}^{mx_i}H_j +D \le \min(H_{mn_i-1},H_{mx_i+1})\);其次这棵子树内不能有更小的开区间,即 \(\min_{j=mn_i}^{mx_i}H_j +D\gt \max_{j=mn_i}^{mx_i}H_j\)。整理得 \(D\) 合法的范围是一段区间,也就是说每个开区间对取值在一段区间内的 \(D\) 有贡献,于是 \(L=0,R=N-1\) 时只需先做所有区间加,再依次单点查。

现在考虑任给 \(L,R\) 的情况,不妨令 \(H_{L-1}=H_{R+1}=\inf\),这会对一些区间产生影响。首先完全在 \([L,R]\) 内部和外部的区间都不受影响,而原来跨过 \((L-1,L)\) 的区间左端点会和 \(L-1\)\(\max\),跨过 \((R,R+1)\) 的区间右端点会和 \(R+1\)\(\min\),也就是说相比原来,新产生的一些区间是左端点为 \(L-1\) 或右端点为 \(R+1\) 的。我们现在尝试找到以 \(L-1\) 为左端点的区间中右端点最小的一个,设为 \((L-1,p)\),发现等价于找最小的 \(p\ge L\) 使得存在 \(L\le j<k\le p\)\(h_k-h_j\ge D\),这可以用线段树二分实现。同理可以找到以 \(R+1\) 为右端点的区间中左端点最大的一个,设为 \((q,R+1)\)。现在我们要找完全在 \((p,q)\) 内的极小区间个数,也就是说对于一棵子树 \(x\) 它能被选当且仅当 \(mn_x,mx_x,D\) 都在某个区间内,这是个类似三维偏序的东西。实际上,如果 \(p\le mn_x\le q\),那么 \(mx_x\le q\) 或者 \(mx_x \ge R+1\),并且满足后者的极小区间最多只有 \(1\) 个,那么我们可以先忽略 \(mx_x\) 的限制,算出 \(mn_x,D\) 都在某个区间内的答案,这是个类似二维偏序的东西,然后再找到所有极小区间满足 \(mn_x\)\([p,q]\) 之间中 \(mx_x\) 的最大值,判断是否要将答案额外减 \(1\) 即可。

由于强制在线,前后者都要用可持久化线段树维护(后者具体来讲就是随着 \(D\) 的增加,加入或删除了一些区间,每个位置 \(i\) 维护的值是当前极小区间中是否存在以 \(i\) 为左端点的区间,如果存在右端点是多少)。

时间复杂度 \(O((N+Q)\log N)\),空间复杂度 \(O(N\log N)\)

3.P8326 [COCI2021-2022#5] Fliper

把每个循环看成一个点,特别地,我们把所有「沿着某一方向一直运动下去而不碰到挡板」的情况看成一个无限大的循环(也就是这些情况共用一个点),每个挡板恰好出现在两个循环中(这也保证了循环数是 \(O(n)\) 的),如果两个循环(可以相同)共用了某个挡板,就在这两个循环代表的点之间连边。于是问题转化成了给边四染色,要保证每个点相邻的边中四种颜色的边都相同并且都为偶数。

首先每个点的度数都得是 \(8\) 的倍数,其次我们可以对每个连通块单独做。考虑任取一个点开始跑欧拉回路,将经过的边交替黑白染色,由于边数等于度数之和的一半,所以边数是 \(4\) 的倍数,也是偶数,所以每个点相邻的边中恰有一半的边是黑色的,一半的边是白色的。把黑白子图拎出来再各单独做一遍上述过程,同样可以分析出边数是偶数,进而每个点相邻的边中恰有一半的边是黑色的,一半的边是白色的。所以就相当于四染色了。

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

4.P6844 [CEOI2019] Building Skyscrapers

首先想到时光倒流,初始有一些黑格子,每次可以把一个黑格子变白。一个必要条件是初始时黑格子要八连通,神奇的是这也是充分条件(但我不会证)。考虑只保留每个黑格周围 \(3\times 3\) 的白格,并维护这些白格属于哪个四连通块。每次把一个黑格改成白格,就把新生成的白格与上下左右的白格合并,用启发式合并。判断一个白格所在四连通块是否是无界的只需看这个白格是否和所有白格中最上方的(如有多个再取最左方的)在同一个连通块。

如何判断一个黑格 \(u\) 是否能变白?只需满足 \(u\) 变白后黑格仍八连通,即 \(u\) 周围 \(3\times 3\) 的黑格两两间能不通过 \(u\) 互相到达(在八连通意义下)。只考虑 \(u\) 周围 \(3\times 3\) 的格子的情况下,对于两个 \(u\) 周围的黑格 \(b_1,b_2\),如果 \(b_1\) 顺时针走到 \(b_2\) 或逆时针走到 \(b_2\) 经过的格子全是黑格,那它们一定连通;否则顺时针和逆时针都会至少经过一个白格,一个结论是存在顺时针经过的白格 \(w_1\) 和逆时针经过的白格 \(w_2\) 在同一连通块当且仅当 \(b_1\)\(b_2\) 不在同一连通块,所以这种情况下只需判断顺时针经过的白格是否有和逆时针经过的白格在同一连通块的情况。

现在我们可以 \(O(1)\) 判断一个黑格能否变白。初始时可以先把能变白的黑格放入大根堆中,每次不断从堆中选编号最大的黑格,判断该黑格现在能否变白,直至选出一个满足条件的黑格。每次把一个黑格变成白格后,原来不能变白但现在能变白的只有该黑格周围 \(3\times 3\) 的黑格,以及从有界变为无界的白格周围 \(3\times 3\) 的黑格,把它们都加入堆即可。总加入次数是 \(O(n)\) 的。

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

5.CF1158E Strange device

不妨以 \(1\) 为根,设 \(1\) 的深度为 \(0\)。首先确定每个点的深度。一开始我们知道了所有深度为 \(0\)\(n\) 的点,假设我们知道了所有深度为 \(l\)、深度为 \(r\) 以及深度在 \((l,r)\) 的点,尝试问出所有深度为 \(mid=\lfloor\frac{l+r}{2}\rfloor\) 的点,只要把所有深度为 \(l\) 的点的 \(d\) 设成 \(mid-l-1\) 问一次(其它点 \(d\) 设成 \(0\)),再设成 \(mid-l\) 问一次(其它点 \(d\) 设成 \(0\)),那么深度在 \((l,r)\) 中多的那部分点就是深度为 \(mid\) 的点,这花费 \(2\) 次询问。

\(solve(l,r)\) 表示我们知道了所有深度为 \(l\)、深度为 \(r\) 以及深度在 \((l,r)\) 的点,尝试问出深度在 \((l,r)\) 的点的具体深度的过程。一开始是 \(solve(0,n)\),然后花费 \(2\) 次变成 \(solve(0,\lfloor\frac{n}{2}\rfloor),solve(\lfloor\frac{n}{2}\rfloor,n)\),然后花费 \(4\) 次变成 \(solve(0,\lfloor\frac{n}{4}\rfloor),solve(\lfloor\frac{n}{4}\rfloor,\lfloor\frac{n}{2}\rfloor),solve(\lfloor\frac{n}{2}\rfloor,\lfloor\frac{3n}{2}\rfloor),solve(\lfloor\frac{3n}{2}\rfloor,n)\),然后花费 \(8\) 次……以此类推,总共要花费 \(2n\) 次。但是这个过程是可以并行的!具体而言你可以把排在奇数位的 \(solve\) 一起做,偶数位的 \(solve\) 一起做,这样只需 \(4\)\(solve\) 的数量就会翻一倍,总共要花费 \(4\lceil\log_2 n\rceil\) 次。

接下来确定每个点的父亲。把所有点按深度模 \(3\) 分组,依次通过询问深度模 \(3\)\(o(0\le o\le 2)\) 的点来确定深度模 \(3\)\((o+1)\bmod 3\) 的点的父亲。进行 \(\lceil\log_2 n\rceil\) 次询问,第 \(i\) 次询问把所有深度模 \(3\)\(o\) 且二进制下第 \(i\) 位为 \(1\) 的点的 \(d\) 设成 \(1\),其它点的 \(d\) 都设成 \(0\),那么深度模 \(3\)\((o+1)\bmod 3\) 的那些点就可以知道其父亲第 \(i\) 位是 \(0\) 还是 \(1\) 了,从而用 \(3\lceil\log_2 n\rceil\) 次询问确定了所有点的父亲。

总询问次数为 \(7\lceil\log_2 n\rceil\)

6.P6575 [BalticOI 2017] Friends

定义合法点集为满足点集内点数不超过 \(p\),且向外连的边的总数不超过 \(q\) 的点集,现在我们要尝试把原图分成若干两两不交但它们的并是全集的合法点集。

首先如果有点度数大于 \(p+q\) 就是无解,其次如果有解那么一定存在所有点集内部都连通的解(考虑划分成合法子集数量最多的解),否则可以把不为连通块的点集划分成至少两个点集。对每个点 \(u\) 判断是否能找到一个包含 \(u\) 的合法点集,由于 \(p+q\) 很小所以直接暴力,具体而言维护三个点集 \(S_1,S_2,S_3\),分别表示和 \(u\) 相邻的点中,一定和 \(u\) 在同一个点集内的点、一定和 \(u\) 不在同一个点集内的点、以及还未确定的点。每次从 \(S_3\) 中任选一个点并枚举它是加入 \(S_1\) 还是 \(S_2\),由于 \(|S_1|\le p,|S_2|\le q,|S_3|\le p+q\),所以总共会加入 \(O(\sum_{i=0}^{p}\sum_{j=0}^{q}\binom{i+j}{i})\) 次点,由 做题笔记-2023.04.13 P6575 [BalticOI 2017] Friends 的结论可知这是 \(O(\binom{p+q}{\lfloor\frac{p+q}{2}\rfloor})\) 的级别的。每次加入一个点还要顺带更新一下 \(S_1\)\(S_2\) 之间的边数,这是 \(O(p+q)\) 的。所以对一个点可以 \(O(\binom{p+q}{\lfloor\frac{p+q}{2}\rfloor}(p+q))\) 找到一个包含它的合法点集,或者断言无解。

一个结论是,如果 \(A,B\) 都是合法点集,那么 \(A\setminus B\)\(B\setminus A\) 中至少有一个合法点集:考虑 \(C=A\cap B\),不妨设 \(C\)\(A\setminus B\) 间的边数大等于 \(C\)\(B\setminus A\) 间的边数,那么把 \(B\) 替换成 \(B\setminus A\) 后内部点数变少了,和外部连边也不会变多。所以两两枚举点集,把它们变成无交的,由于点集求交是 \(O(p)\) 的,所有点集的大小和是 \(O(np)\) 的,每减少一个大小为 \(k\) 的交的复杂度是 \(O(kp)\) 的,故这部分的时间复杂度为 \(O(n^2p+np^2)\)

总时间复杂度 \(O(n\binom{p+q}{\lfloor\frac{p+q}{2}\rfloor}(p+q)+n^2p+np^2)\),空间复杂度 \(O(n(p+q))\)

7.AT_cf17_final_i Full Tournament

不妨所有人的位置和编号都为 \(0\sim 2^{N}-1\)(从 \(0\) 开始标号),设 \(a_i\) 表示在位置 \(i\) 的人的编号。我们把比赛的过程稍微改一下:第 \(i\)\(a_x\)\(a_{x\oplus 2^i}\)\(\oplus\) 表示异或)比赛,把赢的人放到位置 \(\min(x,x\oplus 2^i)\),输的人放到位置 \(\max(x,x\oplus 2^i)\),并把输的人排名加上 \(2^{N-i}\)。这和原来是等价的。进一步地,我们把所有人初始位置二进制翻转,于是第 \(i\) 轮变成了 \(a_x\)\(a_{x\oplus 2^{N-i}}\) 比赛,把赢的人放到位置 \(\min(x,x\oplus 2^{N-i})\),输的人放到位置 \(\max(x,x\oplus 2^{N-i})\),并把输的人排名加上 \(2^{N-i}\)。最后每个人的位置就是他的排名!

我们考虑最终的位置要满足什么条件。一个结论是,假设最终 \(0\sim 2^N-1\) 位置上的人依次为 \(p_0,\cdots,p_{2^N-1}\),这合法当且仅当对于任意 \(0\le x\lt 2^N,0\le y\lt N\),有 \(p_{\min(x,x\oplus 2^y)}\lt p_{\max(x,x\oplus 2^y)}\)。首先对于满足后者条件的序列 \(p\),让一开始 \(0\sim 2^N-1\) 位置上的人也依次为 \(p_0,\cdots,p_{2^N-1}\),可以发现经过 \(N\) 轮比赛后所有人位置都不变,因此这样的最终位置是合法的。其次要说明合法的最终位置能推出后面的结论:\(N=1\) 时显然可以;假设 \(<N\) 时都可以,现在考虑 \(=N\) 时,设一开始第 \(i\) 个位置上的人是 \(b_i\),经过第一轮比赛后第 \(i\) 个位置上的人是 \(c_i\),那么之后奇偶位置的人就独立了,把奇偶位置单独拎出来看并根据 \(N-1\) 时的归纳假设可知最后 \(0\le x\lt 2^N,1\le y\lt N\),都满足 \(p_{\min(x,x\oplus 2^y)}\lt p_{\max(x,x\oplus 2^y)}\),现在要说明 \(y=0\) 时也满足。首先第一轮过后肯定是满足的,接下来我们说明如果第 \(i-1\) 轮过后满足,那么第 \(i\) 轮过后也满足。在第 \(i\) 轮,对于任意两个位置 \(2k,2k+1\),不妨设 \(A=\min(2k,(2k)\oplus 2^{N-i}),B=\max(2k,(2k)\oplus 2^{N-i}),C=\min(2k+1,(2k+1)\oplus 2^{N-i}),D=\max(2k+1,(2k+1)\oplus 2^{N-i})\),那么 \(p_{A}\) 要和 \(p_{B}\) 比赛,\(p_{C}\) 要和 \(p_{D}\) 比赛,并且我们知道 \(p_A<p_C,p_B<p_D\),比完赛后 \(A,B,C,D\) 位置上的人变成 \(\min(p_A,p_C),\min(p_B,p_D),\max(p_A,p_C),\max(p_B,p_D)\),可以发现仍然满足 \(\min(p_A,p_C)<\min(p_B,p_D),\max(p_A,p_C)<\max(p_B,p_D)\),所以原结论也就得证了。

\(a_i\) 表示 \(i\) 最终的排名,现在问题变成有 \(N2^N\) 对限制 \((u,v)\) 表示 \(a_u\lt a_v\),并且一些位置的 \(a\) 值已经确定。对于限制 \((u,v)\),我们从 \(u\)\(v\) 连边,这样会得到一张 DAG,\(a\) 一定是这张 DAG 的一个拓扑序。这个问题和 Gym102059D Dumae 一样,具体而言,每个点 \(i\)\(L_i,R_i\) 表示最小和最大的可能拓扑序,对于已经确定的 \(a_x\)(以及肯定有的 \(a_1=1\))让 \(L_x=R_x=a_x\),如果有边 \(u\rightarrow v\)\(L_v=\max(L_v,L_u+1),R_u=\min(R_u,R_v-1)\)。接着依次确定拓扑序为 \(2^N,\cdots,1\) 的点,考虑把所有区间按右端点从大到小排序,确定拓扑序为 \(i\) 的点时直接贪心选还未选的区间中 \(R\ge i\)\(L\) 最大的一个。可以发现对于当前选的点,它的所有后继的 \(L,R\) 都比它的 \(L,R\) 大,而它是目前还未选的区间中 \(R\ge i\)\(L\) 最大的一个,这就说明它的后继都已经被选了,所以这么选选出的是拓扑序。

时间复杂度 \(O(N2^N)\),空间复杂度 \(O(N2^N)\)

8.QOJ#4884. Battleship: New Rules

我们从格点的角度考虑,一艘 \(1\times a\) 的船会占据 \(2\times (a+1)\) 个格点,并且任意两艘船占据的格点不交。船数固定后,占据尽量多的格子等价于占据尽量多的格点,一共有 \((n+1)\times(n+1)\) 个格点,所以 \(n\) 为奇数时至少剩 \(0\) 个,\(n\) 为偶数时至少剩 \(1\) 个。如下构造可以达到这个下界:首先 \(3\times 3\)\(4\times 4\) 的情况我们可以分别手动构造需要 \(3/4\) 艘船覆盖所有格点/只剩一个格点的情况。然后 \(n\times n\) 的情况可以在右下角 \((n-2)\times (n-2)\) 的基础上加上最左边一列和最上面一行的后 \(n-2\) 个格子。这时候总船数达到了 \(k\) 的下界 \(n\),如果船数仍 \(<k\) 我们考虑把一艘 满足 \(a\ge 3\)\(1\times a\)(或 \(a\times 1\))的船变成一艘 \(1\times 1\) 的船和一艘 \(1\times(a-2)\) 的船,占据的格点数不变,但是船数多了 \(1\),重复这个过程可以发现是能达到 \(k\) 的上界 \(\lceil\frac{n}{2}\rceil^2\) 的。

而 Bob 的任务就变成找一个不在边上/角上且未被覆盖的格点。\(n\) 是奇数直接输出无解,\(n\) 是偶数恰有一个格点未被覆盖,而且可以分析出它一定不在边上/角上(考虑和它在边界上相邻的两个点被谁覆盖)!所以 Bob 要找到唯一未被覆盖的格点。考虑分治,先竖着把最中间的一列的格子都问一遍,如果一艘船是横着的,或者是竖着的但完全在最中间一列的左边或右边,那么它覆盖左右两侧的格点数都是偶数个,唯一一种情况是船是竖着的且完全在最中间一列。那么我们可以知道左侧和右侧被覆盖格点数的奇偶性,从而确定未被覆盖的格点在左侧还是右侧。就这样竖着问一次,横着问一次……横竖交替地问下去,总询问次数约为 \(n+\frac{n}{2}+\frac{n}{2}+\frac{n}{4}+\cdots=3n\)

9.QOJ#4820. Kitten’s Computer

首先把 \(a_1\)\(64\) 位每一位都拆出来,把第 \(i\) 位存到 \(a_{A_i}\) 中(\(A\) 是你自己定的互不相同的位置),用倍增把 \(a_{A_i}\) 都用 \(a_1\) 的第 \(i\) 位填满,再通过与上 \(a_2\) 并左移 \(i\) 位可以得到 \(a_2\)\(a_1\) 的第 \(i\) 位相乘的结果,答案就是 \(\sum_{i=0}^{63} a_{A_i}\)。这步可以花不超过 \(16\) 次。

考虑一个叫全加器的东西,\(a,b,c\) 相加等于 \(a\oplus b\oplus c,2((a\&b)\oplus(b\&c)\oplus(c\&a))\) 相加(\(\oplus\) 是异或运算)。那么我们就可以在一定步数内把三个数相加变成两个数相加,而我们一共要把 \(64\) 个数相加,每次取 \(t\) 最小的 \(3\) 个一直做直到只剩下两个数。精细实现一下,比如利用 \((a\&b)\oplus(b\&c)\oplus(c\&a)=((a\oplus c)\&b)\oplus(c\&a)\) 等,可以让最后剩下的两个数的 \(t\) 的最大值不超过 \(44\)

假设剩下两个数为 \(a_x,a_y\),我们要算 \(a_x+a_y\),假设已经知道 \(d_i\) 表示 \(0\sim i-1\) 位是否会向第 \(i\) 位进位,那么答案就是 \(a_x\oplus a_y\oplus \overline{d_{63}\cdots d_0}\)。设 \(p_i\) 表示 \(a_x\) 的第 \(i\) 位异或上 \(a_y\) 的第 \(i\) 位,\(g_i\) 等于 \(a_x\) 的第 \(i\) 位与上 \(a_y\) 的第 \(i\) 位,考虑如果 \(0\sim i-1\) 有进位到第 \(i\) 位,那么我们不妨钦定是从 \(j\) 进位来的,其中 \(g_j=1\)\(\forall j<k<i\)\(p_k=1\)

\(P_{i,t}\) 表示 \(\forall j\in(i-2^t,i]\),是否都有 \(p_j\)\(1\)\(G_{i,t}\) 表示只考虑 \((i-2^t,i]\) 中的位,能否进位到第 \(i+1\) 位。初始时 \(P_{i,0}=p_i,G_{i,0}=g_i\),转移 \(P_{i,t}=P_{i,t-1}\&P_{i-2^{t-1},t-1},G_{i,t}=G_{i,t-1}|(G_{i-2^{t-1},t-1}\&P_{i,t-1})\),于是 \(d_{i}=G_{i-1,6}\)。到这步为止实现得好的话只要不超过 \(58\) 次。

10.QOJ#4811. Be Careful

没讲。

11.AT_apc001_g Colorful Doors

把从第 \(2N\) 个传送门出来的那段路和进第 \(1\) 个传送门前的那段路连起来,就变成了一个环。称两个传送门之间的路为一段,现在有 \(2N\) 个段,其中第 \((i+2N-2)\bmod(2N)+1\) 个传送门和第 \(i\) 个传送门之间的段是第 \(i\) 段,第 \(1\) 段必须经过。

把每个段看成一个点,每个段的前驱(后继)都是固定且互不相同的,每个段向它后继连有向边,这样每个段入度出度都为 \(1\),形成了若干置换环。我们的要求就是第 \(1\) 段所在的置换环中的段有且仅有一定要被经过的段。

先考虑每个段都要被经过的情况。

  1. \(2N=4k\)。这种情况的一种构造是 \(1,2,1,2,3,4,3,4,\cdots,2N-1,2N,2N-1,2N\)

  2. \(2N=4k+2\)。我们考虑一开始有个环,环上一个传送门都没有,现在每次往上面添加一对传送门,如果这对传送门所在段在同一个置换环上,那么这个置换环就会分裂成两个置换环;如果这对传送门所在段在不同置换环上,那么这个置换环就会分合并成一个置换环。总之,置换环的数量的奇偶性会发生变化,并且置换环的数量的奇偶性与 \(N\) 的奇偶性相反。所以 \(N\) 是奇数时所有段不可能都在一个环上。

现在考虑一般情况。假设 \(2N\) 个段是否必经组成的 \(01\) 串有若干个极长连续 \(1\) 段(首尾也相连,例如 \(1010110011\) 的极长连续 \(1\) 段有 \(1,11,111\)),每个极长段的长度减去 \(1\) 就是该段中两边都是必经段的传送门个数 \(cnt\)。那么是否有解只和这些极长段的 \(cnt\) 组成的可重集有关。

  1. 每个极长段的 \(cnt\) 之和是奇数。由于两边都是必经段的传送门必须和两边都是必经段的传送门配对,所以无解。

  2. 每个极长段的 \(cnt\) 之和 \(=4k\)。注意到如果有两个 \(cnt\) 分别为 \(x,y\) 的极长段,可以让一个极长段的最后一扇门和另一个极长段的第一扇门相同,从而合并成一个 \(x+y\) 的极长段。重复下去就变成了情况 \(1\)

  3. 每个极长段的 \(cnt\) 之和 \(=4k+2\),但是有至少两个极长段的 \(cnt\) 不为 \(0\)。在这两个 \(cnt\) 不为 \(0\) 的极长段内各选第一个两边都是必经段的传送门把它们组成一对,这样两个段的长度都减少了 \(1\),就变成了情况 \(4\)

  4. 每个极长段的 \(cnt\) 之和 \(=4k+2\),但是有至多一个极长段的 \(cnt\) 不为 \(0\)。由于 \(cnt\)\(0\) 的段只能拼在另一个段的开头(即让 \(cnt\)\(0\) 的段的最后一个传送门和另一个段的第一个传送门相同)或结尾(同理),并且拼在一起后另一个段不发生任何改变,这样下去最后就变成了情况 \(2\)

时间复杂度 \(O(N)\),空间复杂度 \(O(N)\)

posted @ 2023-04-12 13:05  18Michael  阅读(11)  评论(2编辑  收藏  举报