CF1861
只做出 A,身败名裂
显然不管怎么排,13,31
总有一个会出现,看看哪个出现。
给定两个 01 串,每次可以挑一个串的一个子串,要求两端相同,然后把这个子串全部变得和两端相同。
问经过若干次操作,能否使两个串相同。
重要性质:如果能变相同,存在一种方案,任意两次操作的子串都不相交。
证明:显然两个两端不同的子串不可能相交,因为先操作的做完了,后操作的一个端点就变没了,不可能。
而如果是两个两端相同的,可以合并成一次操作,反正最后它们的并都会变成一个。
然后就可以布尔型 DP,
题意:初始数组为空。给定一个操作序列,+
代表往数组末尾加一个数,-
表示从末尾删掉一个,1
表示此时数组要单调不减,0
表示此时数组不能单调不减。
你可以安排每次往数组加什么数,问能不能有一种方案可以满足操作序列中所有 0
和 1
。
感性一下。每次加入肯定是尽量加入和当前末尾元素相同的。如果是要求不能单调不减,肯定可以只让最后一个数下降。
类比有取 vector
),栈顶元素代表此时数组的单调性。1
表示单调不减,0
表示不单调不减,-1
表示待定。
初始在栈中加一个 1
,但是 cnt
保持 0
。(cnt
类比栈顶指针)这代表当数组空的时候,也是单调不减的。
每次加入一个元素:
-
如果
cnt = 0
(数组为空),显然变成一个数依然一定单调不减,则往栈中加入1
。 -
如果当前栈顶元素是
1
(代表当前数组一定是单调不减的),且当前数组长度 (加了新数后长度至少为 ),则栈加入-1
。因为我们加数之后既可以使数组变成单调不减的,也可以变成严格单调减的。 -
如果当前栈顶元素是
0
,即当前数组严格单调减,加入一个数也一定还是严格单调减,所以加入0
。 -
如果当前栈顶是
-1
,也往栈中加入-1
。
每次删一个元素,直接把栈顶弹掉。但是还要注意,如果弹掉了一个 1
,表示删之前数组是单调不减的,删之后也应该是单调不减的。所以还要把当前栈顶改成 1
。
每次遇到一个 1
,如果当前栈顶是 0
,一定不可能满足,退出循环;如果是 1
,刚好,啥也不干;如果是 -1
,把栈顶改成 1
。
遇到 0
和遇到 1
类似处理。
题意:给定一个序列,每次操作可以挑一个区间,自选一个整数 x
(可以负数),把区间内每个数乘上 x
。
如果最后全部都是正数,最好的方案就是对于所有
但如果有负数,一定是把一个前缀变成单调递减的,然后集体乘上一个负数。枚举这个前缀的长度即可。
(注意其实长度
题意:给定
求所有长度为
不去考虑每一种方案,而是考虑每一个可行的子区间的贡献。
设
更新,可以枚举上一个合法区间的结束位置
我们再搞一个辅助 DP 数组
怎么算
然后还要减去第一个合法区间右端点是
假设上一个合法区间右端点为
-
,即 足够放下一个排列。那这种情况 是一个排列, 每个位置随便填, 就是 。所以这种情况
。 -
,则 任意一种方案,都会对应出 个不符合要求的情况: 和 共用了一部分元素,剩下没共用的元素还有 个,所以 的方案数有 种。所以这种情况
。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!