CF1861
只做出 A,身败名裂
显然不管怎么排,13,31
总有一个会出现,看看哪个出现。
给定两个 01 串,每次可以挑一个串的一个子串,要求两端相同,然后把这个子串全部变得和两端相同。
问经过若干次操作,能否使两个串相同。
重要性质:如果能变相同,存在一种方案,任意两次操作的子串都不相交。
证明:显然两个两端不同的子串不可能相交,因为先操作的做完了,后操作的一个端点就变没了,不可能。
而如果是两个两端相同的,可以合并成一次操作,反正最后它们的并都会变成一个。
然后就可以布尔型 DP,\(dp[i]\) 表示前 \(i\) 个字符能否变得相同。
题意:初始数组为空。给定一个操作序列,+
代表往数组末尾加一个数,-
表示从末尾删掉一个,1
表示此时数组要单调不减,0
表示此时数组不能单调不减。
你可以安排每次往数组加什么数,问能不能有一种方案可以满足操作序列中所有 0
和 1
。
感性一下。每次加入肯定是尽量加入和当前末尾元素相同的。如果是要求不能单调不减,肯定可以只让最后一个数下降。
类比有取 \(\min\) 操作的栈,我们搞一个栈(vector
),栈顶元素代表此时数组的单调性。1
表示单调不减,0
表示不单调不减,-1
表示待定。
初始在栈中加一个 1
,但是 cnt
保持 0
。(cnt
类比栈顶指针)这代表当数组空的时候,也是单调不减的。
每次加入一个元素:
如果
cnt = 0
(数组为空),显然变成一个数依然一定单调不减,则往栈中加入1
。如果当前栈顶元素是
1
(代表当前数组一定是单调不减的),且当前数组长度 \(\ge 1\)(加了新数后长度至少为 \(2\)),则栈加入-1
。因为我们加数之后既可以使数组变成单调不减的,也可以变成严格单调减的。如果当前栈顶元素是
0
,即当前数组严格单调减,加入一个数也一定还是严格单调减,所以加入0
。如果当前栈顶是
-1
,也往栈中加入-1
。
每次删一个元素,直接把栈顶弹掉。但是还要注意,如果弹掉了一个 1
,表示删之前数组是单调不减的,删之后也应该是单调不减的。所以还要把当前栈顶改成 1
。
每次遇到一个 1
,如果当前栈顶是 0
,一定不可能满足,退出循环;如果是 1
,刚好,啥也不干;如果是 -1
,把栈顶改成 1
。
遇到 0
和遇到 1
类似处理。
题意:给定一个序列,每次操作可以挑一个区间,自选一个整数 x
(可以负数),把区间内每个数乘上 x
。
如果最后全部都是正数,最好的方案就是对于所有 \(a_i\ge a_{i+1}\) 的位置,把 \(a_{i+1}\sim a_n\) 都乘上一个很大的数。
但如果有负数,一定是把一个前缀变成单调递减的,然后集体乘上一个负数。枚举这个前缀的长度即可。
(注意其实长度 \(x\) 的数组和长度 \(x+1\) 的数组,可以 \(O(1)\) 递推得到,所以整体复杂度其实是 \(O(n)\) 的)
题意:给定 \(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\)。
\(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!\)。
\(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)!\)。
随机推荐
- freeswitch查看所有通道变量
概述 freeswitch 是一款好用的开源软交换平台. 实际应用中,我们经常需要对fs中的通道变量操作,包括设置和获取,set & get. 但是,fs中有众多的内部定义通道变量,也有外部传 ...
- C#设计模式14——模板方法的写法
模板方法(Template Method)是一种设计模式,它定义了一个操作中的算法的骨架,将某些步骤推迟到子类中实现,从而使得子类可以在不改变算法骨架的情况下重新定义算法的某些步骤. 作用: 使用模板 ...
- 机器学习-无监督机器学习-kmeans衍生的算法-18
目录 1. k-Medoids 2. 二分KMEANS 3. KMeans++ 4. elkan KMeans 5. min batch KMeans算法 6.小结: 1. k-Medoids 之前的 ...
- C++11 同步与互斥
C++11 同步与互斥 0. C++11的线程 #include <thread> 面向对象的接口 RAII(资源获取即初始化)机制,当线程对象被销毁时,会自动执行析构函数,如果线程仍然在 ...
- [转帖]等待事件 enq:TX - row lock contention分析与解决
6月30日,数据库发生了大量锁表.大概持续1小时,并且越锁越多.后来通过业务人员停掉程序,并kill掉会话后解决. 几天后再EM上查看CPU占用: CPU发生了明显等待. 主要是由于enq:TX - ...
- [转帖]修改vcenter数据库账号密码
1.修改sqlserver sa账号密码 2.停止vcenter服务 cd C:\Program Files\VMware\vCenter Server\bin service-control --l ...
- [转帖]如何升级vCenter(VCSA)补丁?
https://www.dinghui.org/upgrade-vcsa-patch.html VCSA的升级分为repo源和iso镜像两种方式,由于使用repo源进行升级只支持HTTPS和FTPS协 ...
- 【转帖】【笔记】python连接神通数据库
https://www.cnblogs.com/wyongbo/p/17054924.html python连接国产神州通用数据库. 一.准备 下载whl及dll: 链接: https://pan.b ...
- [转帖]iozone磁盘读写测试工具的使用以及命令详解、下载(网站最详细讲解步骤)
一.iozone简介 iozone是一款开源工具,用来测试文件系统的读写性能,也可以进行测试磁盘读写性能. 二.下载 方式一:网站下载http://www.iozone.org/ 方式二:个人网盘存放 ...
- [转帖]jvm学习三-MAT内存分析工具的使用
目录 1 模拟内存溢出程序 1.1 jvm配置 1.2 测试代码 2 MAT工具进行内存分析 2.1 大纲介绍 2.2 Histogram视图介绍 2.3 Leak Suspects视图介绍 2.4 ...