CF1948

A

题意:定义一个字符是特殊的,当且仅当它左右两边恰有一个字符与之相同。要求构造一个字符串,使得恰好有 \(n\) 个特殊字符,或判断无解。

考虑一个连续的字符段,如果长度 \(1\),不贡献特殊字符;否则必然贡献 \(2\) 个。所以无解条件就是 \(2\not\mid n\)

否则可以用 AABAABAABAAB... 构造。

B

题意:给定一个序列。可以选择其中若干个数,将它们拆成它们的数位,例如把 123 拆成 1 和 2 和 3,然后放到它们原来的位置。问能否用这种方法使数组单调上升排序。

发现肯定只会把一个前缀拆成数位。

C

题意:给定一个 \(2\times n\) 的字符图,每个字符为 ><。初始在 \((1,1)\),每次可以向任意方向走一步,然后移到那个格子内字符指向的格子。问能不能到达 \((2,n)\)\(n\le 2e5\)。(就算走到了 \((2,n)\) 也会滑走,必须是滑到 \((2,n)\)

\(slide[i][j]\) 表示如果滑到 \((i,j)\) 能不能到达 \((2,n)\)\(walk[i][j]\) 表示如果走到 \((i,j)\) 能不能到达 \((2,n)\)

初始 \(slide[2][n]=true\)

转移方程:$$slide[i][j]=walk[i-1][j]||walk[i+1][j]||walk[i][j-1]||walk[i][j+1]$$

\[walk[i][j]=slide[to(i)][to(j)] \]

这里 \(to(i),to(j)\) 表示 \((i,j)\) 指向的格子的坐标。

用 BFS 转移。

D

题意:称一个字符串是好的,当且仅当它的长度是偶数且它的前一半等于后一半(不是回文!)。
给定字符串,其中有一些 ? 表示可以任意决定这个位置的字符。求最大的好的子串能有多长。\(n\le 5000\)

其实正解非常简单。

从大到小枚举最大的好串长度的一半 \(k\)。我们要 \(O(n)\) 判断 \(k\) 可不可行。

如果 \(s[i]=s[i+k]\),令 \(vis[i]\leftarrow 1\);否则 \(vis[i]\leftarrow 0\)。则问题就变成判断是否有连续 \(k\)\(1\)。很简单。

E

题意:给定 \(n\)\(k\),需要对每个点赋一个权值 \(a_i\)\(a_1\sim a_n\) 要构成一个 \(1\sim n\) 的排列。赋值结束后,对于两个点 \(i,j\),若 \(|i-j|+|a_i-a_j|\le k\),在它们之间连边。定义一张图的权值为它的团的个数。找到一种方法使得图的权值最小。\(n\le 40,k\le 2n\)

这个数据范围给的非常有迷惑性。

结论:团的个数最小为 \(\lceil\dfrac{n}{k}\rceil\)

首先每个团内部的点个数 \(\le k\),这是显然的。

其次,我们可以让 \(1\sim k\) 号点对应的 \(a_i\)\(1\sim k\),以此类推。然后我们只需要说明 \(1\sim k\) 号点用 \(1\sim k\) 的编号能构造一个大小为 \(k\) 的团即可。

怎么构造呢?令 \(m=\lceil\dfrac{k}{2}\rceil\)\(a_1=m,a_2=m-1,\dots,a_m=1,a_{m+1}=n,a_{m+2}=n-1,\dots,a_n=m+1\)

posted @ 2024-03-17 20:14  FLY_lai  阅读(7)  评论(0编辑  收藏  举报