CF1948
题意:定义一个字符是特殊的,当且仅当它左右两边恰有一个字符与之相同。要求构造一个字符串,使得恰好有 \(n\) 个特殊字符,或判断无解。
考虑一个连续的字符段,如果长度 \(1\),不贡献特殊字符;否则必然贡献 \(2\) 个。所以无解条件就是 \(2\not\mid n\)。
否则可以用 AABAABAABAAB...
构造。
题意:给定一个序列。可以选择其中若干个数,将它们拆成它们的数位,例如把 123 拆成 1 和 2 和 3,然后放到它们原来的位置。问能否用这种方法使数组单调上升排序。
发现肯定只会把一个前缀拆成数位。
题意:给定一个 \(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]$$
这里 \(to(i),to(j)\) 表示 \((i,j)\) 指向的格子的坐标。
用 BFS 转移。
题意:称一个字符串是好的,当且仅当它的长度是偶数且它的前一半等于后一半(不是回文!)。
给定字符串,其中有一些?
表示可以任意决定这个位置的字符。求最大的好的子串能有多长。\(n\le 5000\)。
其实正解非常简单。
从大到小枚举最大的好串长度的一半 \(k\)。我们要 \(O(n)\) 判断 \(k\) 可不可行。
如果 \(s[i]=s[i+k]\),令 \(vis[i]\leftarrow 1\);否则 \(vis[i]\leftarrow 0\)。则问题就变成判断是否有连续 \(k\) 个 \(1\)。很简单。
题意:给定 \(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\)。