只做出 A,身败名裂

A

显然不管怎么排,13,31 总有一个会出现,看看哪个出现。

B

给定两个 01 串,每次可以挑一个串的一个子串,要求两端相同,然后把这个子串全部变得和两端相同。

问经过若干次操作,能否使两个串相同。

重要性质:如果能变相同,存在一种方案,任意两次操作的子串都不相交。

证明:显然两个两端不同的子串不可能相交,因为先操作的做完了,后操作的一个端点就变没了,不可能。

而如果是两个两端相同的,可以合并成一次操作,反正最后它们的并都会变成一个。

然后就可以布尔型 DP,\(dp[i]\) 表示前 \(i\) 个字符能否变得相同。

C

题意:初始数组为空。给定一个操作序列,+ 代表往数组末尾加一个数,- 表示从末尾删掉一个,1 表示此时数组要单调不减,0 表示此时数组不能单调不减。

你可以安排每次往数组加什么数,问能不能有一种方案可以满足操作序列中所有 01

感性一下。每次加入肯定是尽量加入和当前末尾元素相同的。如果是要求不能单调不减,肯定可以只让最后一个数下降。

类比有取 \(\min\) 操作的栈,我们搞一个栈(vector),栈顶元素代表此时数组的单调性。1 表示单调不减,0 表示不单调不减,-1 表示待定。

初始在栈中加一个 1,但是 cnt 保持 0。(cnt 类比栈顶指针)这代表当数组空的时候,也是单调不减的。

每次加入一个元素:

  1. 如果 cnt = 0(数组为空),显然变成一个数依然一定单调不减,则往栈中加入 1

  2. 如果当前栈顶元素是 1(代表当前数组一定是单调不减的),且当前数组长度 \(\ge 1\)(加了新数后长度至少为 \(2\)),则栈加入 -1。因为我们加数之后既可以使数组变成单调不减的,也可以变成严格单调减的。

  3. 如果当前栈顶元素是 0,即当前数组严格单调减,加入一个数也一定还是严格单调减,所以加入 0

  4. 如果当前栈顶是 -1,也往栈中加入 -1

每次删一个元素,直接把栈顶弹掉。但是还要注意,如果弹掉了一个 1,表示删之前数组是单调不减的,删之后也应该是单调不减的。所以还要把当前栈顶改成 1

每次遇到一个 1,如果当前栈顶是 0,一定不可能满足,退出循环;如果是 1,刚好,啥也不干;如果是 -1,把栈顶改成 1

遇到 0 和遇到 1 类似处理。

D

题意:给定一个序列,每次操作可以挑一个区间,自选一个整数 x(可以负数),把区间内每个数乘上 x

如果最后全部都是正数,最好的方案就是对于所有 \(a_i\ge a_{i+1}\) 的位置,把 \(a_{i+1}\sim a_n\) 都乘上一个很大的数。

但如果有负数,一定是把一个前缀变成单调递减的,然后集体乘上一个负数。枚举这个前缀的长度即可。

(注意其实长度 \(x\) 的数组和长度 \(x+1\) 的数组,可以 \(O(1)\) 递推得到,所以整体复杂度其实是 \(O(n)\) 的)

E

题意:给定 \(n,k\)。一个数组的价值定义为从这个数组中最多能选出多少个不相交的子区间,使得每个子区间恰好包含 \(1\sim k\) 各一次。

求所有长度为 \(n\) 的,每个数都 \(\in[1,k]\) 的数组的价值之和。

不去考虑每一种方案,而是考虑每一个可行的子区间的贡献。

设 \(dp_i\) 为 “长度为 \(i\) 的区间,\([i-k+1,i]\) 是一个合法区间的方案数”,则这一段对答案的贡献是 \(1\times dp_i\times k^{n-i}\),最后 \(k^{n-i}\) 是因为后面的可以随便选。

更新,可以枚举上一个合法区间的结束位置 \(j\),用 \(dp_j\) 更新,但是还要要求 \([j+1,i]\) 的第一个合法区间是 \([i-k+1,i]\)。

我们再搞一个辅助 DP 数组 \(g_i\),表示长度为 \(i\) 的数组第一个合法区间是 \([i-k+1,i]\) 的方案数。

怎么算 \(g_i\)?首先如果只要求 \([i-k+1,i]\) 合法,有 \(k^{i-k}\times k!\),即最后 \(k\) 个是排列,前面随便。

然后还要减去第一个合法区间右端点是 \(k\sim i-1\) 的所有情况。(注意减去的情况也要满足 \([i-k+1,i]\) 合法,因为上面的总数是保证了 \([i-k+1,i]\) 合法的)这又要分类讨论。

假设上一个合法区间右端点为 \(j\)。

  1. \(i-j\ge k\),即 \(j+1\sim i\) 足够放下一个排列。那这种情况 \([i-k+1,i]\) 是一个排列,\([j+1,i-k]\) 每个位置随便填,\([1,j]\) 就是 \(g_j\)。

    所以这种情况 \(g_i-=g_j\times k^{i-j-k}\times k!\)。

  2. \(i-j<k\),则 \(g_j\) 任意一种方案,都会对应出 \((i-j)!\) 个不符合要求的情况:\([i-k+1,i]\) 和 \([j-k+1,j]\) 共用了一部分元素,剩下没共用的元素还有 \(i-j\) 个,所以 \([j+1,i]\) 的方案数有 \((i-j)!\) 种。

    所以这种情况 \(g_i-=g_j\times (i-j)!\)。

随机推荐

  1. P2241

    这么多年不写代码,竟然忘了longlong这茬,我半天没想明白错在哪里,过了好久才反应过来.浪费不少时间,真的得记住longlong 啊.... Code #include <iostream& ...

  2. freeswitch的gateway配置方案优化

    概述 freeswitch是一款简单好用的VOIP开源软交换平台. 在之前的文章中,我们简单介绍过gateway的三种配置方案,但是实际应用之后发现,方案中的参数设置有缺陷,会导致一些问题. 本文档中 ...

  3. poj 1426 深搜

    ***可能有多个答案,DFS一下找出一个答案即可*** #include<stdio.h> #include<string.h> #include<stdlib.h> ...

  4. sql语句内变量的使用

    0.原始表格如下: 1.定义变量,并在sql语句内查询: set @user_name = "成龙";SELECT * FROM `tb_user` where userName ...

  5. electron打包,使用electron-packager

    构建项目可以使用electron-forge构建,但是这个东西打包比较坑,mac运行报错,win下会有缓存机制,也就是热更新无效 所以选择使用electron-packager打包 sudo npm ...

  6. 重写SpringCloudGateway路由查找算法,性能提升100倍!

    如果你也在做SpringCloudGateway网关开发,希望这篇文章能给你带来一些启发 背景 先说背景,某油项目,通过SpringCloudGateway配置了1.6万个路由规则,实际接口调用过程中 ...

  7. [转帖]SQLServer的UTF8支持

    排序规则和 Unicode 支持 - SQL Server | Microsoft Learn UTF-8 支持 SQL Server 2019 (15.x) 完全支持广泛使用的 UTF-8 字符编码 ...

  8. [转帖]TiDB Lightning 在数据迁移中的应用与错误处理实践

    TiDB Lightning 在数据迁移中的应用与错误处理实践 作者简介:DBA,会点 MySQL,懂点 TiDB,Python. 个人主页:https://tidb.net/u/seiang/ans ...

  9. [转帖]SQL Server数据库存储总结

    SQL Server数据库存储文件类型:数据文件和日志文件.数据文件以页面作为存储单元存储数据. 页面:即数据页面,数据页(Page).是系统在磁盘间中分配的一段大小为8k的连续空间. 文件头(Fil ...

  10. 【转帖】10个Linux 系统性能监控命令行工具

    引言: 系统一旦跑起来,我们就希望它能够稳定运行,不要宕机,不出现速度变慢.因此,对于Linux 系统管理员来说每天监控和调试 Linux 系统的性能问题是一项繁重却又重要的工作.监控和保持系统启动并 ...