Set To Max (Hard Version)

比赛遇到这种题目不要惊慌,一般都是用贪心

由于是序列操作题目,我们没有太多的办法,不可能把所有的情况都列举出来,所以根据贪心一般都有一个操作的顺序

这里我们按照bi单调递增地操作,循环到某个bi时,我们考虑ai对应的数是多少,如果ai<bi,我们考虑如何将ai变成bi

上面是我们的猜想,现在我们来证明这是正确的

对任意一种符合题意的操作序列,如果存在相邻的两次操作,使得前一次操作的xx的含义看题干)比后一次操作的x大,那么这两次操作一定是不相交的(否则后一次操作的x一定至少不低于前面一次的x),于是交换这两次操作,最终的答案显然也符合题意

也就是说,我们一定能找到一种合法的操作序列,使得每一次操作的x不降,所以我们可以从小到大考虑bi,而且我们后面的操作一定不会去影响前面的操作(这里后面的操作一定要是bi增大了之后的操作,不能是不增的操作,实际上,我们的每次操作是考虑如何将所有相同的bi对应的ai改成bi

我们再思考一下,就会发现,如果要将ai改成bi,一定是找i前面或者后面最近的一个jaj=bi,可以用决策包容性证明

可以想想以上操作怎么做,我的赛时代码是树状数组加st表,实际上可以用单调栈

我们以向右扩展为例,处理出每个位置i右边第一个aj=bi的位置j(设为pos1),处理出i右边第一个bj<bi的位置j(设为pos2),处理出i右边第一个aj>bi的位置j(设为pos3),如果pos2>pos1pos3>pos1那么就可以变换

对于向左拓展是一样的,分享一个代码小技巧,我们对向右拓展写一个函数封装,然后将数组倒过来再写一个函数封装就好了

posted @   最爱丁珰  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示