sol
01串
对于相邻的两个段和
如果
那么在构建的图中,一些点已经被确定,一些点没有被确定,但是通过连边关系也能被确定。通过BFS可以求出所有已经确定的点。
接下来,对于前K个元素,我们计算其中还需要补充的1的个数a和尚未确定的位置b,答案既是C(b,a)。从b中任意选a个填1即可。
翻转匹配
分类讨论
对于|T|=1的情况,只需要判断S中是否有对应字符
对于
对于
对于
对于
对于
对于一次操作,我们相当于从两个连续段中分别扣除a个0和b个0,再分别添加b个0和a个0(实际上是一个交换的过程)。那么也就是有若干个串允许增加1或者2个0,有若干个串需要减少若干个0。我们希望步骤尽量少,既尽量一次减少两个0。贪心即可。
建筑修缮
称一个数在山谷里,当且仅当在左边和右边都有严格比它大的数。
观察这样一个过程,将所有在山谷里的数的最小值整体+1
。
每次操作 (i,j,k),
带来的代价是固定的,我们需要尽可能最小化
带来的代价。先将这些数中最左边和最右边的数+1
,然后操作中间的数就可以令
,非常划算。为了最小化最左边和最右边的数操作的代价,可以算出先左后右,先右后左的代价。这是一个求一段前缀/后缀中某个数后继的问题,可以选用自己喜欢的数据结构维护。
然而h的值域非常大,令x为目前的山谷里的最小值,y为x在所有h_i中的后继,将所有山谷里的最小值从x加到y的过程中,由于需要改变的数的集合不变,可以整体处理,而这个集合只会改变 O(n)次,故复杂度是 O(nlogn)的。
旅行商问题
当K=1时:
交易员必须时刻不停的获取收益,寻找1开始的最长链即可。
当K=2时:
使用树形dp:
设dp1[u]为从u点出发,停在u的子树内的最大价值。
设dp2[u]为从u点出发,停在u的某个儿子或者u本身的最大价值
设dp3[u]为从点u的某个儿子出发,停在u的子树内的最大价值。
那么我们梳理一下具体的构造方式,其中rev()代表把路径反向,v1,v2,...,vk代表u的儿子
方式1:dp1[u]=u->rev(dp2[v1])->v2->...>vk->dp1[vk]
方式2:dp1[u]=u->dp3[v1]
方式3:dp2[u]=u->rev(dp2[v1])->v2->v3->...->vk-1->vk
方式4:dp3[u]=v1->v2->...->dp2[vk-1]->u->dp3[vk]
方式5:dp3[u]=dp2[v1]->u->rev(dp2[v2])->v3->...->vk-1->dp1[vk]
当K=3时
当K=3,交易员可以获取所有的收益,构造方法是:
u->rev(DFS(v1))->rev(DFS(v2))->...rev(DFS(vk))。这样的方式可以遍历所有的点,只需要构造出对应的路径即可。在dfs的过程中标记是否需要反转路径,该标记决定点u是先插入到vector还是后插入到vector即可。
本文作者:wscqwq
本文链接:https://www.cnblogs.com/wscqwq/p/17741091.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步