CF1948

A

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

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

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

B

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

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

C

题意:给定一个 2×n 的字符图,每个字符为 ><。初始在 (1,1),每次可以向任意方向走一步,然后移到那个格子内字符指向的格子。问能不能到达 (2,n)n2e5。(就算走到了 (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[i1][j]||walk[i+1][j]||walk[i][j1]||walk[i][j+1]

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

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

用 BFS 转移。

D

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

其实正解非常简单。

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

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

E

题意:给定 nk,需要对每个点赋一个权值 aia1an 要构成一个 1n 的排列。赋值结束后,对于两个点 i,j,若 |ij|+|aiaj|k,在它们之间连边。定义一张图的权值为它的团的个数。找到一种方法使得图的权值最小。n40,k2n

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

结论:团的个数最小为 nk

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

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

怎么构造呢?令 m=k2a1=m,a2=m1,,am=1,am+1=n,am+2=n1,,an=m+1

posted @   FLY_lai  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示